繼承

2015-09-07 47 views
1

我的問題是如何處理的財產繼承方法,如setgetdidSetwillSet ......?繼承

讓我們舉個例子:我想覆蓋Swift類中屬性的setter方法。下面是我想要實現(這顯然是不工作)什麼:

class A { 
    var value: Int {get {...} set {...} } 
} 

class B: A { 
    var value: Int { 
     set(newValue) { 
      // do some fancy stuff... 
     } 
    } 
} 

這不是工作,太:

// in class B 
override func setValue(newValue: Int) { 
    // do some fancy stuff... 
} 

我們可以在斯威夫特是這樣做的:

class A { 
    var _value: Int = 0 
    var value: Int { 
     get { 
      return _value 
     } 
     set { 
      _value = newValue 
     } 
    } 
} 

class B: A { 
    override var value: Int { 
     get { 
      return _value 
     } 
     set { 
      _value = newValue + 1 
     } 
    } 
} 

let a = A() 
a.value = 1 
print(a.value) // => 1 

let b = B() 
b.value = 1 
print(b.value) // => 2 

這種方法不是很優雅,因爲我必須實現getter方法,這實際上不是必需的,因爲只有setter方法應該被覆蓋。

+1

在你的第一個例子中,基類屬性存儲,而子類一個計算,他們有爲了與重寫做任何事情都是一樣的。 – Kametrixom

+0

你說得對,這只是爲了表達目標。 –

+0

@Kametrixom雖然確實無法用已存儲的屬性覆蓋已計算的屬性,但也可以使用其他方法。 – Qbyte

回答

0

不幸的是,如果你真的想這樣做,你唯一的方法就是創建一個單獨的get和set方法。

class A { 
    private var value: Int = 0 

func getValue() -> Int { return value } 
func setValue(newValue : Int) { 
    value = newValue 
} 
} 

通過使用計算性能你基本上是做在某些方面是「捷徑」在製作兩種不同的方法的本質 - 和因此你必須同時覆蓋set和get,如果你想改變的東西。

3

你可以這樣做:

class A { 
    var value: Int = 0 
} 

class B: A { 
    override var value: Int { 
     get { return super.value } 
     set { 
      // Something fancy... 
      super.value = newValue 
     } 
    } 
} 

雖然你仍然有B實現一個getter,你至少不需要_value,這有助於保持類A乾淨。

+0

這使得它更清潔,但下面的問題是:如何繼承屬性相關的方法,如'get','set','willSet',... –

+0

@MichaelDorner:我可能是錯的,但'var value:超類中的Int = 0是一個* stored *屬性,因此(除非用'@ objc'標記),它沒有可以繼承的'set' /'get'方法。 –

+0

你是對的,這只是爲了演示的目的。第二個代碼是計算屬性。 –

0

根據您的使用的didSet的覆蓋可以做的伎倆(根據您的最後一個例子):

class B: A { 
    override var value: Int { 
     didSet { 
      _value++ 
     } 
    } 
}