为什么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()
}

除了这行不通:

  1. foo 不是 open 并且不能被覆盖。

  2. 你需要调用A的构造函数。 class B(val a: A) : A(a.x) 也无济于事:x 不是 A 的成员。

  3. equalshashCode 呢:他们是委托的吗?任何一个决定都会导致奇怪的后果。