一個類可以繼承另一個類的方法,屬性和其他特性。當一個類繼承其他類時,繼承類叫子類,被繼承類叫超類(或父類)。在Swift中,繼承具有單繼承的特點,每個子類只有一個直接父類,繼承是區分類與其他類型的一個基本特征。 在Swift中,類可以調用和訪問父類的方法,屬性和下標腳本,並且可以重寫這些方法,屬性和 ...
一個類可以繼承另一個類的方法,屬性和其他特性。當一個類繼承其他類時,繼承類叫子類,被繼承類叫超類(或父類)。在Swift中,繼承具有單繼承的特點,每個子類只有一個直接父類,繼承是區分類與其他類型的一個基本特征。
在Swift中,類可以調用和訪問父類的方法,屬性和下標腳本,並且可以重寫這些方法,屬性和下標腳本來優化或修改他們的行為。Swift會檢查你的重寫定義在父類中是否有匹配的定義,以此確保你的重寫行為是正確的。可以為類中繼承來的屬性添加屬性觀察器,這樣,當屬性值改變時,類就會被通知到。可以為任何屬性添加屬性觀察器,無論它原來被定義為存儲型屬性還是計算型屬性。
1.定義一個基類
不繼承於其他類的類,稱之為基類。(Swift中的類並不是從一個通用的基類繼承而來。如果你不為你定義的類指定一個超類的話,這個類就自動成為基類。)
class Fruit { var weight = 0.0 func info() { print("我是一個水果,重\(weight)") } } var f = Fruit() f.info() //我是一個水果,重0.0
2.子類生成
子類生成指的是在一個已有類的基礎上創建一個新的類。子類繼承父類的特性,並且可以優化或改變它。你還可以為子類添加新的特性。為了指明某個類的超類,將超類名寫在子類名的後面,用冒號分隔:
class SomeClass: SomeSuperClass { //類的定義 }
定義一個Apple類,繼承Fruit
class Apple: Fruit { var name : String! func taste() { print("\(name) taste good") } } var a = Apple() a.weight = 3.2 a.name = "黃香蕉" a.info() //我是一個水果,重3.2 a.taste() //黃香蕉 taste good
3.重寫
子類可以為繼承來的實例方法,類方法,實例屬性或下標腳本提供自己的實現,這種行為叫重寫。當子類重寫父類的方法時,要使用override修飾。
當子類重寫了父類的方法,屬性或下標腳本,子類將無法訪問父類中被覆蓋的內容,此時你可以使用super首碼來訪問父類版本的方法,屬性和下標腳本。
3.1重寫方法
Apple類重寫了父類的info方法,並調用super.info,列印兩次。
class Apple: Fruit { var name : String! func taste() { print("\(name) taste good") } override func info() { super.info() print("\(name) weight is \(weight)") } } var a = Apple() a.weight = 3.2 a.name = "黃香蕉" a.info() //我是一個水果,重3.2 黃香蕉 weight is 3.2
3.2重寫屬性
Swift允許提供定製的getter(或setter)來重寫任意繼承來的屬性,無論繼承來的屬性是存儲型的還是計算型的屬性。子類並不知道繼承來的屬性是存儲型的還是計算型的,它只知道繼承來的屬性的名字和類型。因此你在重寫一個屬性時,必須將它的名字和屬性都寫出來。可以將一個繼承來的只讀屬性重寫為一個讀寫屬性,但不能將一個繼承來的讀寫屬性重寫為一個只讀屬性。
class Fruit { var weight = 0.0 var description : String { return "\(self.weight)" } } class Apple: Fruit { var name : String! override var description: String { return self.name + " weight is " + super.description } } var a = Apple() a.weight = 4.0 a.name = "黃香蕉" print(a.description) // 黃香蕉 weight is 4.0
3.3重寫屬性觀察者
不要為繼承來的常量存儲屬性或繼承來的只讀計算型屬性添加屬性觀察者,這些屬性的值是不會發生任何改變的。
不要同時提供重寫的setter和重寫的屬性觀察器,如果你想觀察屬性值的變化,並且已經為那個屬性提供了setter方法,那麼你在setter中就可以觀察到了。
class Fruit { var weight = 0.0 } class Apple: Fruit { var name : String! override var weight: Double { didSet { super.weight += 1 } } } var a = Apple() a.weight = 4.0 print(a.weight) //5.0
3.4重寫下標
重寫下標可以提供定製的getter和setter。重寫下標時,可以將父類的只讀下標改寫為讀寫下標,但不能將父類的讀寫下標重寫為只讀下標。
3.5防止重寫
final修飾符,可修飾類、屬性、方法、下標。使用final修飾的類不能被繼承,使用final修飾的方法、屬性、下標腳本不能被重寫。