子類生成(Subclassing)指的是在一個(gè)已有類的基礎(chǔ)上創(chuàng)建一個(gè)新的類。子類繼承超類的特性,并且可以優(yōu)化或改變它。你還可以為子類添加新的特性。
為了指明某個(gè)類的超類,將超類名寫(xiě)在子類名的后面,用冒號(hào)分隔:
class SomeClass: SomeSuperclass {
// 類的定義
}
下一個(gè)例子,定義一個(gè)更具體的車輛類叫Bicycle。這個(gè)新類是在 Vehicle類的基礎(chǔ)上創(chuàng)建起來(lái)。因此你需要將Vehicle類放在 Bicycle類后面,用冒號(hào)分隔。
我們可以將這讀作:
“定義一個(gè)新的類叫Bicycle,它繼承了Vehicle的特性”;
class Bicycle: Vehicle {
init() {
super.init()
numberOfWheels = 2
}
}
preview Bicycle是Vehicle的子類,Vehicle是Bicycle的超類。新的Bicycle類自動(dòng)獲得Vehicle類的特性,比如 maxPassengers和numberOfWheels屬性。你可以在子類中定制這些特性,或添加新的特性來(lái)更好地描述Bicycle類。
Bicycle類定義了一個(gè)構(gòu)造器來(lái)設(shè)置它定制的特性(自行車只有2個(gè)輪子)。Bicycle的構(gòu)造器調(diào)用了它父類Vehicle的構(gòu)造器 super.init(),以此確保在Bicycle類試圖修改那些繼承來(lái)的屬性前Vehicle類已經(jīng)初始化過(guò)它們了。
注意:
不像 Objective-C,在 Swift 中,初始化器默認(rèn)是不繼承的,見(jiàn)初始化器的繼承與重寫(xiě)
Vehicle類中maxPassengers的默認(rèn)值對(duì)自行車來(lái)說(shuō)已經(jīng)是正確的,因此在Bicycle的構(gòu)造器中并沒(méi)有改變它。而numberOfWheels原來(lái)的值對(duì)自行車來(lái)說(shuō)是不正確的,因此在初始化器中將它更改為 2。
Bicycle不僅可以繼承Vehicle的屬性,還可以繼承它的方法。如果你創(chuàng)建了一個(gè)Bicycle類的實(shí)例,你就可以調(diào)用它繼承來(lái)的description方法,并且可以看到,它輸出的屬性值已經(jīng)發(fā)生了變化:
let bicycle = Bicycle()
println("Bicycle: \(bicycle.description())")
// Bicycle: 2 wheels; up to 1 passengers
子類還可以繼續(xù)被其它類繼承:
class Tandem: Bicycle {
init() {
super.init()
maxPassengers = 2
}
}
上面的例子創(chuàng)建了Bicycle的一個(gè)子類:雙人自行車(tandem)。Tandem從Bicycle繼承了兩個(gè)屬性,而這兩個(gè)屬性是Bicycle從Vehicle繼承而來(lái)的。Tandem并不修改輪子的數(shù)量,因?yàn)樗允且惠v自行車,有 2 個(gè)輪子。但它需要修改maxPassengers的值,因?yàn)殡p人自行車可以坐兩個(gè)人。
注意:
子類只允許修改從超類繼承來(lái)的變量屬性,而不能修改繼承來(lái)的常量屬性。
創(chuàng)建一個(gè)Tandem類的實(shí)例,打印它的描述,即可看到它的屬性已被更新:
let tandem = Tandem()
println("Tandem: \(tandem.description())")
// Tandem: 2 wheels; up to 2 passengers
注意,上一篇:Swift命名類型參數(shù)下一篇:Swift自動(dòng)引用計(jì)數(shù)