有没有什么办法来覆盖Kotlin中扩展类的setter属性

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 ( 默认情况下是final的 ):

另外,你的getter被写成get() = selectedColor ,setter拥有this.selectedColor = selectedColor赋值,它们实际上都是对同一个访问器的递归调用,这将导致StackOverflowError 。 要访问后台字段的值 ,请改用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() } } 

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

你需要设置你的var selectedColor打开。 我认为这很好

喜欢这个 :

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