Swift子類生成
子類生成(Subclassing)
*子類生成(Subclassing)*指的是在一個已有類的基礎上創建一個新的類。子類繼承超類的特性,並且可以優化或改變它。你還可以爲子類添加新的特性。
爲了指明某個類的超類,將超類名寫在子類名的後面,用冒號分隔:
class SomeClass: SomeSuperclass {
// 類的定義
}
下一個例子,定義一個更具體的車輛類叫Bicycle
。這個新類是在 Vehicle
類的基礎上創建起來。因此你需要將Vehicle
類放在 Bicycle
類後面,用冒號分隔。
我們可以將這讀作:
「定義一個新的類叫Bicycle
,它繼承了Vehicle
的特性」;
class Bicycle: Vehicle {
init() {
super.init()
numberOfWheels = 2
}
}
preview Bicycle
是Vehicle
的子類,Vehicle
是Bicycle
的超類。新的Bicycle
類自動獲得Vehicle
類的特性,比如 maxPassengers
和numberOfWheels
屬性。你可以在子類中定製這些特性,或添加新的特性來更好地描述Bicycle
類。
Bicycle
類定義了一個構造器來設置它定製的特性(自行車只有2個輪子)。Bicycle
的構造器調用了它父類Vehicle
的構造器 super.init()
,以此確保在Bicycle
類試圖修改那些繼承來的屬性前Vehicle
類已經初始化過它們了。
注意:
不像 Objective-C,在 Swift 中,初始化器默認是不繼承的,見初始化器的繼承與重寫
Vehicle
類中maxPassengers
的默認值對自行車來說已經是正確的,因此在Bicycle
的構造器中並沒有改變它。而numberOfWheels
原來的值對自行車來說是不正確的,因此在初始化器中將它更改爲 2。
Bicycle
不僅可以繼承Vehicle
的屬性,還可以繼承它的方法。如果你創建了一個Bicycle
類的實例,你就可以調用它繼承來的description
方法,並且可以看到,它輸出的屬性值已經發生了變化:
let bicycle = Bicycle()
println("Bicycle: \(bicycle.description())")
// Bicycle: 2 wheels; up to 1 passengers
子類還可以繼續被其它類繼承:
class Tandem: Bicycle {
init() {
super.init()
maxPassengers = 2
}
}
上面的例子創建了Bicycle
的一個子類:雙人自行車(tandem)。Tandem
從Bicycle
繼承了兩個屬性,而這兩個屬性是Bicycle
從Vehicle
繼承而來的。Tandem
並不修改輪子的數量,因爲它仍是一輛自行車,有 2 個輪子。但它需要修改maxPassengers
的值,因爲雙人自行車可以坐兩個人。
注意:
子類只允許修改從超類繼承來的變量屬性,而不能修改繼承來的常量屬性。
創建一個Tandem
類的實例,打印它的描述,即可看到它的屬性已被更新:
let tandem = Tandem()
println("Tandem: \(tandem.description())")
// Tandem: 2 wheels; up to 2 passengers
注意,Tandem
類也繼承了description
方法。一個類的實例方法會被這個類的所有子類繼承。