【问题标题】:Property not Overridden when using by keyword in Kotlin在 Kotlin 中使用关键字时未覆盖属性
【发布时间】:2022-10-01 07:27:24
【问题描述】:

我试图拥有一个接口的两个实现,其中一个从另一个实现继承默认值,但覆盖了一个。

这是一个显示该行为的示例:

fun main() {
    println(Bottom.value) // prints: bottom
    println(Bottom.determineValue()) // prints: middle
}

interface Top {

    val value: String

    val otherValue: String

    fun determineValue() = value
}

object Middle : Top {
    override val value = \"middle\"
    override val otherValue = \"something else\"
}

object Bottom : Top by Middle {
    override val value = \"bottom\"
}

我遇到了意想不到的行为,当属性valueBottom 实现之外使用时,它会从Middle 而不是Bottom 返回值。

如果有人对为什么会发生这种情况有更深入的了解,我将不胜感激任何解释

    标签: kotlin


    【解决方案1】:

    这是Kotlin documentation of the delegate functionality 中描述的预期行为。

    但是请注意,以这种方式覆盖的成员不会被调用 来自委托对象的成员,它只能访问自己的 接口成员的实现

    用作委托的实现不知道它正在用作委托,因此不能也不会访问该其他类的成员。它的任何调用其其他成员的实现都不会使用类中将其用作委托的重写版本。除了重新实现该功能外,没有办法解决这个问题:

    object Bottom : Top by Middle {
        override val value = "bottom"
        override fun determineValue() = value
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多