位置:首頁 > 高級語言 > Swift教學 > Swift子類生成

Swift子類生成

子類生成(Subclassing)

子類生成(Subclassing)指的是在一個已有類的基礎上創建一個新的類。子類繼承超類的特性,並且可以優化或改變它。你還可以為子類添加新的特性。

為了指明某個類的超類,將超類名寫在子類名的後麵,用冒號分隔:

class SomeClass: SomeSuperclass {
    // 類的定義
}

下一個例子,定義一個更具體的車輛類叫Bicycle。這個新類是在 Vehicle類的基礎上創建起來。因此你需要將Vehicle類放在 Bicycle類後麵,用冒號分隔。

我們可以將這讀作:

“定義一個新的類叫Bicycle,它繼承了Vehicle的特性”;

class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}

preview BicycleVehicle的子類,VehicleBicycle的超類。新的Bicycle類自動獲得Vehicle類的特性,比如 maxPassengersnumberOfWheels屬性。你可以在子類中定製這些特性,或添加新的特性來更好地描述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)。TandemBicycle繼承了兩個屬性,而這兩個屬性是BicycleVehicle繼承而來的。Tandem並不修改輪子的數量,因為它仍是一輛自行車,有 2 個輪子。但它需要修改maxPassengers的值,因為雙人自行車可以坐兩個人。


注意:
子類隻允許修改從超類繼承來的變量屬性,而不能修改繼承來的常量屬性。
 

創建一個Tandem類的實例,打印它的描述,即可看到它的屬性已被更新:

let tandem = Tandem()
println("Tandem: \(tandem.description())")
// Tandem: 2 wheels; up to 2 passengers

注意,Tandem類也繼承了description方法。一個類的實例方法會被這個類的所有子類繼承。