我有以下基类和接口
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?有什么我看不到的缺点吗?显式指定覆盖似乎有很多不必要的代码,特别是如果我对多个方法和多个子类执行此操作。
我认为发出警告至少有两个原因:
该行为对于foo()使用哪个实现是不明确的。foo()由于超类和委托是在同一行声明的,所以没有直观的预期哪个应该获胜。我已经使用 Kotlin 几年了,如果不进行测试,我无法告诉您会出现哪种行为,因为这是一种不寻常的设置。
如果 Base 超类中的任何函数调用,您可能会得到意想不到的行为foo(),因为它们将调用委托foo()而不是它们自己的。在这种情况下可能没问题,但在大多数情况下,当您重写函数时,您需要调用 super 以防出现必要的副作用。对于代表来说这是不可能的。
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |