使用委托的 Kotlin 隐式覆盖

Dev*_*oev 2 kotlin

我有以下基类和接口

open class Base {
    open fun foo() { println("Base.foo") }
}

fun interface Delegate {
    fun foo(): Unit
}
Run Code Online (Sandbox Code Playgroud)

现在我想重写使用委托的foo子类的方法,如下所示:ComposedBase

class Composed(delegate: Delegate) : Base(), Delegate by delegate
Run Code Online (Sandbox Code Playgroud)

这按我的意图工作。的实例Composed使用foo的方法delegate,而不是 from 的方法Base但是,我收到 IntelliJ 的警告:

委托成员 'fun foo(): Unit' 隐藏超类型覆盖: public open fun foo(): 在 Base 中定义的 Unit。请明确指定正确的覆盖。

为什么我会收到此错误?隐式重写该方法有什么“坏处” foo?有什么我看不到的缺点吗?显式指定覆盖似乎有很多不必要的代码,特别是如果我对多个方法和多个子类执行此操作。

Ten*_*r04 7

我认为发出警告至少有两个原因:

  1. 该行为对于foo()使用哪个实现是不明确的。foo()由于超类和委托是在同一行声明的,所以没有直观的预期哪个应该获胜。我已经使用 Kotlin 几年了,如果不进行测试,我无法告诉您会出现哪种行为,因为这是一种不寻常的设置。

  2. 如果 Base 超类中的任何函数调用,您可能会得到意想不到的行为foo(),因为它们将调用委托foo()而不是它们自己的。在这种情况下可能没问题,但在大多数情况下,当您重写函数时,您需要调用 super 以防出现必要的副作用。对于代表来说这是不可能的。