使用Kotlin by关键字时属性未被正确覆盖的问题
接口委托后覆盖属性在默认方法中不生效的原因
你的问题核心在于Kotlin接口委托(by关键字)的工作机制:
- 当你用
object Bottom : Top by Middle定义委托类时,编译器会自动为Bottom生成Top接口中所有未被显式覆盖的成员实现,这些实现会直接调用委托对象Middle的对应成员。 - 你显式覆盖了
value属性,所以直接访问Bottom.value时,会使用你定义的"bottom"值。 - 但
determineValue()方法你没有覆盖,所以编译器生成的实现会调用Middle.determineValue()。而接口中的默认方法determineValue()里的value引用,是指向该方法所属实例的value——也就是Middle自己的value("middle"),所以最终返回的是Middle的属性值。
如果想要让determineValue()使用Bottom的value,只需要在Bottom中显式覆盖这个方法即可:
object Bottom : Top by Middle { override val value = "bottom" // 显式覆盖方法,使用当前类的value override fun determineValue() = value }
这样修改后,Bottom.determineValue()就会返回"bottom",符合预期。
内容的提问来源于stack exchange,提问作者Andavin
相关产品推荐
相关产品推荐

