一、類的繼承
類能夠從其它類繼承方法、屬性以及其它特性,當一個類從另外的類繼承時,繼承的類稱爲子類,它繼承的類稱爲超類。在Swift中,繼承是類區別與其它類型(結構、枚舉)的基礎行爲。
1.1 、類的繼承
類的繼承語法如下:
class SomeClass: SomeSuperclass {
// class definition goes here
}
該例定義了一個新類SomeClass,它繼承自SomeSuperclass類,SomeSuperclass類是SomeClass類的超類,SomeClass是SomeSuperclass類的子類。
子類繼承和保留它的超類的所有特性(包括屬性、方法和其它特性),並可以添加自己的方法、屬性、下標等,以及可以重新實現(稱爲重寫)繼承的方法、屬性或下標來提供自己的版本。
子類除了繼承、重寫實現自己的特性外,還可以添加其它超類沒有的自己專有的方法、屬性、下標。
1.2 類的重寫
爲了重寫一個繼承的特性,需要在重寫的方法前面添加一個override關鍵字 。
在一個重寫的方法中可以使用super關鍵字來調用和存取超類的方法、屬性以及下標方法,如下例所示:
class Vehicle {
var numberOfWheels=0
var maxPassengers=1
func description() ->String {
return "\(numberOfWheels) wheels; up to \ (maxPassengers) passengers"
}
}
class Car:Vehicle {
var speed:Double =0.0
init() {
super.init()
maxPassengers =5
numberOfWheels =4
}
override func description() ->String {
return super.description() +"; "
+"traveling at\(speed) mph"
}
}
Vehicle類定義爲基類。Swift中不提供一個被其它所有類繼承的通用基類(根類),任何沒有規定超類的類都稱爲基類。
定義的Car類是Vehicle類的子類,在Car類中使用override關鍵字重寫了繼承的方法description,在重寫的方法description實現中,使用super關鍵字來調用超類的description方法,以便能夠利用超類的description方法已經實現的功能,從而減少代碼的重複。
在重寫方法中,一個名字爲someMethod的重寫方法能使用super.someMethod() 來調用其超類的方法;一個名字爲someProperty的重寫屬性能夠在getter和setter實現中使用super.someProperty 來存取超類的屬性;一個名字爲someIndex的重寫下標方法能使用super[someIndex] 來調用超類的下標方法。
通過提供特定的getter和setter來重寫任意的繼承的實例或類屬性,也無論是繼承的超類屬性是一個存儲屬性還是一個計算屬性。
通過重寫,能夠把一個繼承的只讀的屬性改變爲一個可讀寫屬性,但不能把一個原先是可讀寫的屬性修改爲只讀屬性或只寫屬性。
使用屬性重寫還能爲繼承的屬性添加屬性觀察者。
注意:你不能爲一個繼承的屬性同時提供setter方法和添加屬性觀察者,也不能爲繼承的常量存儲屬性或繼承的只讀的計算屬性添加屬性觀察者。
爲了避免方法和屬性以及下標的重寫,可以在方法、屬性、下標的定義前面添加一個final標記來避免被重寫,例如(@final var, @final func, @final class func,,@final subscript)。
整個類也能被避免重寫,在類定義時,在其class關鍵字前使用final 來標記整個類作爲 final,這樣,該類將不能被繼承。