gpt4 book ai didi

使用委托(delegate)的 Kotlin 隐式覆盖

转载 作者:行者123 更新时间:2023-12-05 09:27:18 25 4
gpt4 key购买 nike

我有以下基类和接口(interface)

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

fun interface Delegate {
fun foo(): Unit
}

现在我想使用委托(delegate)覆盖 Base 的子类 Composedfoo 方法,如下所示:

class Composed(delegate: Delegate) : Base(), Delegate by delegate

这符合我的预期。 Composed 的实例使用 delegatefoo 方法,而不是来自 Base 的方法。 但是,我收到来自 IntelliJ 的警告:

Delegated member 'fun foo(): Unit' hides supertype override: public open fun foo(): Unit defined in Base. Please specify proper override explicitly.

为什么会出现此错误?隐式覆盖 foo 方法有什么“坏”之处?有没有我看不到的缺点?明确指定覆盖似乎有很多不必要的代码,尤其是当我为多个方法和多个子类执行此操作时。

最佳答案

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

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

  2. 如果 Base 父类(super class)中的任何函数调用 foo(),您可能会遇到意外行为,因为它们将调用委托(delegate)的 foo()而不是他们自己的。在这种情况下可能没问题,但在大多数情况下,当您覆盖一个函数时,您希望调用 super 以防出现必要的副作用。这对委托(delegate)来说是不可能的。

关于使用委托(delegate)的 Kotlin 隐式覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72661315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com