有没有办法在Kotlin中扩展类时覆盖setter属性

时间:2017-07-31 13:06:16

标签: android kotlin

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'是最终的,不能被覆盖。 有什么我想念的吗?

2 个答案:

答案 0 :(得分:6)

为此,您需要将class A和属性标记为openthey 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.selectedColor = value代替field = value

答案 1 :(得分:4)

您需要将var selectedColor设置为打开。我认为这很好

像这样:

class A {

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