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

vac*_*ach 11 delegation kotlin

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

在实践中大多数时候我们都有一些实际上根本没有接口的东西,它是一个不实现任何功能但只提供一些功能或实现抽象类的类.

是否有任何基本限制迫使其仅限于接口,或者我们是否可以期望kotlin将来能够不受限制地授权?

如果我们想要使用组合而不是继承来扩展类的功能,这将特别有用.

class A {}
class B(val a: A) : A by a {}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 6

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

class A(x: Int) {
  fun foo() = x
}

class B(val a: A) : A by a {}
Run Code Online (Sandbox Code Playgroud)

需要编译到

class B(val a: A) : A {
  override fun foo() = a.foo()
}
Run Code Online (Sandbox Code Playgroud)

除了这不起作用:

  1. foo是不是open也不能被覆盖.

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

  3. 怎么样equalshashCode:他们被委派了吗?任何一项决定都会导致奇怪的后果.