class A {
    var selectedColor: Int
        get() = selectedColor
        set(selectedColor) {
            this.selectedColor = selectedColor
            doSomething()
        }
}

class B : A {
    override var selectedColor: Int
        get() = selectedColor
        set(selectedColor) {
            this.selectedColor = selectedColor
            doSomethingElse()
        }
}

关键字替代显示错误提示
'selectedColor'是最终的,不能被覆盖。
我有什么想念的吗?

最佳答案

为此,您需要将class A和属性都标记为open(they are final by default):

另外,您的getter会写为get() = selectedColor,setter会使用this.selectedColor = selectedColor分配,这实际上是对同一访问者的递归调用,这将导致StackOverflowError。要使用access the value of the backing field,请改用get() = fieldfield = ...

open class A {
    open var selectedColor: Int = someDefaultValue
        get() = field
        set(value) {
            field = value
            doSomething()
        }
}

然后,您可以override属性,如果您希望getter行为保持不变,则可以调用super.selectedColor:
class B : A() {
    override var selectedColor: Int = someDefaultValue
        get() = super.selectedColor
        set(value) {
            field = value
            doSomethingElse()
        }
}

如果要调用父类(super class)的 setter ,请使用super.selectedColor = value而不是field = value

08-17 17:44