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'是最终的,不能被覆盖。 有什么我想念的吗?
答案 0 :(得分:6)
为此,您需要将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.selectedColor = value
代替field = value
。
答案 1 :(得分:4)
您需要将var selectedColor设置为打开。我认为这很好
像这样:class A {
open var selectedColor: Int
get() = selectedColor
set(selectedColor) {
this.selectedColor = selectedColor
doSomething()
}
}