为什么kotlin只能委托接口?
Why only interfaces can be delegated to in kotlin?
我看过几个类似的问题,但是none已经解释了为什么委托仅限于接口?
在实践中,大多数时候我们有一些实际上根本没有接口的东西,它是一个 class 除了提供一些功能或实现抽象 class.
是否有任何基本限制迫使它仅限于接口,或者我们可以期望 kotlin 将来有不受限制的委托吗?
如果我们想使用组合而非继承来扩展 class 的功能,这将特别有用。
class A {}
class B(val a: A) : A by a {}
当您委托一个接口时,class 仍然实现该接口。因此,为了保持一致性,如果您可以委托 class,它应该以相同的方式工作。 IE。
class A(x: Int) {
fun foo() = x
}
class B(val a: A) : A by a {}
需要编译成
class B(val a: A) : A {
override fun foo() = a.foo()
}
除了这行不通:
foo
不是 open
并且不能被覆盖。
你需要调用A
的构造函数。 class B(val a: A) : A(a.x)
也无济于事:x
不是 A
的成员。
equals
和 hashCode
呢:他们是委托的吗?任何一个决定都会导致奇怪的后果。
我看过几个类似的问题,但是none已经解释了为什么委托仅限于接口?
在实践中,大多数时候我们有一些实际上根本没有接口的东西,它是一个 class 除了提供一些功能或实现抽象 class.
是否有任何基本限制迫使它仅限于接口,或者我们可以期望 kotlin 将来有不受限制的委托吗?
如果我们想使用组合而非继承来扩展 class 的功能,这将特别有用。
class A {}
class B(val a: A) : A by a {}
当您委托一个接口时,class 仍然实现该接口。因此,为了保持一致性,如果您可以委托 class,它应该以相同的方式工作。 IE。
class A(x: Int) {
fun foo() = x
}
class B(val a: A) : A by a {}
需要编译成
class B(val a: A) : A {
override fun foo() = a.foo()
}
除了这行不通:
foo
不是open
并且不能被覆盖。你需要调用
A
的构造函数。class B(val a: A) : A(a.x)
也无济于事:x
不是A
的成员。equals
和hashCode
呢:他们是委托的吗?任何一个决定都会导致奇怪的后果。