2017-07-31 59 views
1
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」是終局的,不能被重寫。 有什麼我失蹤?有什麼辦法來覆蓋擴展類中的setter屬性在科特林

回答

5

要做到這一點,你需要標記都class A和財產openthey are final by default):

而且,你的干將被寫成get() = selectedColor和setters擁有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的財產,如果你想吸氣行爲將保持不變,您可以撥打super.selectedColor

class B : A() { 
    override var selectedColor: Int = someDefaultValue 
     get() = super.selectedColor 
     set(value) { 
      field = value 
      doSomethingElse() 
     } 
} 

如果要調用父類的setter,使用super.selectedColor = value代替field = value

4

您需要將您的var selectedColor設置爲打開。我認爲這是很好

這樣的:

class A { 

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

那工作... !!!謝謝:) –

+1

不錯,如果你想要更多的解釋,請看@熱鍵的回答:) – MrLeblond