为什么只能在kotlin中委托接口?

时间:2017-09-24 07:08:44

标签: kotlin delegation

我见过几个类似的问题,但没有人解释为什么委托只限于接口?

大部分时间在实践中我们都有一些实际上根本没有接口的东西,它是一个什么都不实现,但提供一些功能或实现抽象类的类。

是否有任何基本限制迫使此限制为接口,或者我们是否可以期望kotlin将来可以不受限制地委派?

如果我们想使用组合而不是继承来扩展类的功能,这将非常有用。

class A {}
class B(val a: A) : A by a {}

1 个答案:

答案 0 :(得分:5)

当您委托一个接口时,该类仍然实现该接口。因此,为了保持一致性,如果您可以委派一个类,它应该以相同的方式工作。即

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怎么样?他们被委派了吗?任何一项决定都会导致奇怪的后果。