面试题答案
一键面试Kotlin中委托接口的实现方式
在Kotlin中,委托接口通过by
关键字来实现。假设我们有一个接口MyInterface
,要实现该接口的委托,首先定义一个类实现这个接口,然后在另一个类中通过by
关键字委托给实现了该接口的类实例。
示例代码如下:
interface MyInterface {
fun doSomething()
}
class MyInterfaceImpl : MyInterface {
override fun doSomething() {
println("实现了doSomething方法")
}
}
class DelegatingClass : MyInterface by MyInterfaceImpl()
在上述代码中,DelegatingClass
通过by MyInterfaceImpl()
委托给MyInterfaceImpl
类的实例,从而间接实现了MyInterface
接口。
委托接口与默认方法的联系与区别
- 联系:
- 两者都旨在减少代码重复。默认方法为接口提供了一个通用的实现,而委托接口通过将接口实现委托给其他对象来避免重复实现代码。
- 在某些场景下,都能让类在不直接实现接口方法的情况下,拥有接口定义的行为。
- 区别:
- 实现位置:默认方法是在接口内部提供实现,所有实现该接口的类都可以使用这个默认实现(除非重写)。而委托接口是将接口的实现委托给另一个已实现该接口的对象。
- 灵活性:委托接口更加灵活,因为可以在运行时动态改变委托对象,从而改变行为。而默认方法一旦定义,在编译期就确定了其实现,所有实现类的默认行为是固定的(除非重写)。
- 代码组织:委托接口有助于将不同功能模块分离,使代码结构更清晰,每个类专注于自己的核心功能。默认方法可能导致接口变得臃肿,尤其是当接口有大量默认方法时。
委托接口使用及默认方法体现的代码示例
interface MyInterface {
fun doSomething()
fun defaultMethod() {
println("这是默认方法")
}
}
class MyInterfaceImpl : MyInterface {
override fun doSomething() {
println("实现了doSomething方法")
}
}
class DelegatingClass : MyInterface by MyInterfaceImpl()
fun main() {
val delegatingObject = DelegatingClass()
delegatingObject.doSomething()
delegatingObject.defaultMethod()
}
在上述示例中,MyInterface
定义了defaultMethod
默认方法。DelegatingClass
通过委托实现了MyInterface
接口,它可以直接调用defaultMethod
默认方法,同时其doSomething
方法的实现来自委托的MyInterfaceImpl
类。