为什么只有接口可以委托给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() } 

除非这不起作用:

  1. fooopen ,不能被覆盖。

  2. 你需要调用A的构造函数。 class B(val a: A) : A(ax)也不会帮助: x不是A的成员。

  3. equalshashCode呢:他们是否被委托? 要么这个决定会导致怪异的后果。