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方法。一個類的實例方法會被這個類的所有子類繼承。