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() = 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()
}
}
如果要调用父类(super class)的 setter ,请使用
super.selectedColor = value
而不是field = value
。