为什么只有接口可以委托给kotlin?
我看到过几个类似的问题,但没有一个解释为什么委托仅限于接口?
实际上大多数情况下,我们有一些实际上没有任何接口的东西,它是一个实现了一些功能或者实现一个抽象类的类。
是否有任何根本性的限制,迫使它仅限于接口,或者我们可以期望科林在将来有无限制的授权?
如果我们想使用组合不继承来扩展类的功能,这是特别有用的。
class A {} class B(val a: A) : A by a {}
当你委托一个接口时,这个类还是实现了这个接口。 所以为了一致性,如果你可以委托一个类,它应该以同样的方式工作。 即
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(ax)
也不会帮助:x
不是A
的成员。 -
equals
和hashCode
呢:他们是否被委托? 要么这个决定会导致怪异的后果。