有没有什么办法来覆盖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() = field
和field = ...
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() } }