【Swift初見】Swift繼承

來源:互聯網
上載者:User

標籤:swift   ios   繼承   

對於繼承這個名字大家應該都不陌生,在swift中也是一樣,swift中的一個類可以繼承另一個類的方法,屬性和其他特性。當一個類繼承其他類時,繼承類叫做子類,被繼承的類叫做父類,在swift中繼承是區分類與其他類型的一個基本特徵。

定義一個基類:

當一個類不繼承其他類,這個類叫做基類。比如看下面的代碼:

class vehicle {    var maxPassengers : Int    var manufacturer : String        func description() -> String{        return " max passengers is \(maxPassengers) and manufacturer is \(manufacturer)"    }        init (){        maxPassengers = 2        manufacturer = "Designed By Weasley"    }    }

我們定義了一個基類:vehicle,裡面定義了2個屬性,一個最大乘客數量:maxPassengers,一個製造商:manufacturer,一個init構造器,一個description函數。構造器用來設定屬性的值,用於建立某個類型的一個新執行個體。這個以後再說。

產生子類:

子類是在一個已有類的基礎上建立一個新的類,子類繼承與父類的特徵,並且可以最佳化和改變這些特徵,當然還可以為子類添加新的專屬的特徵。

子類的定義格式如下:

class <#name#>: <#super class#> {    <#properties and methods#>}

冒號前面是子類名稱,冒號後面是父類名字,函數體中可以繼承最佳化並改變父類的相關屬性或方法。

比如,我們定義一個Bicycle類,繼承於vehicle類:

<pre name="code" class="objc">class Bicycle: vehicle {    var numberofWheels : Int = 2    var maxSpeed : Double = 30        override init() {        super.init()        maxPassengers = 2    }        override func description() -> String {        return "numberofWheels : \(numberofWheels)  max passengers :\(maxPassengers) with max speed is \(maxSpeed) manufacturer is \(manufacturer)"    }}

此時我們的Bicycle子類已經建立完成,Bicycle就是vehicle的子類,它包含vehicle的所有特徵,最大乘客數,製造商等。

我們在子類中添加了2個新的屬性,一個是numberofWheels,還有一個maxSpeed,重寫了構造器init函數,還有重寫了description函數,值得注意的是,我們重寫父類中的某些函數的時候,需要在函數名稱之前加上override關鍵字,否字系統編譯器會報錯。

這個時候我們建立一個Bicycle的執行個體,來看看我們的某些值是否正確:

var aBicycle = Bicycle()println(aBicycle.description())

我們得到了如下的輸出:

numberofWheels : 2  max passengers :2 with max speed is 30.0 manufacturer is Designed By Weasley

我們可以看出子類繼承了父類的某些屬性。


訪問父類的屬性或方法:

當你在子類中重寫超類的方法,屬性或附屬指令碼時,有時在你的重寫版本中使用已經存在的
超類實現會大有裨益。比如,你可以最佳化已有實現的行為,或在一個繼承來的變數中儲存一 個修改過的值。
在合適的地方,你可以通過使用 super 首碼來訪問超類版本的方法,屬性或附屬指令碼: 在方法 someMethod 的重寫實現中,可以通過 super.someMethod()來調用超類版本的someMethod 方法。
在屬性 someProperty 的 getter 或 setter 的重寫實現中,可以通過 super.someProperty 來訪問超類版本的 someProperty 屬性。
在附屬指令碼的重寫實現中,可以通過 super[someIndex]來訪問超類版本中的相同附屬指令碼。

比如我們可以改寫剛剛的Bicycle類:

class Bicycle: vehicle {    var numberofWheels : Int = 2    var maxSpeed : Double = 30        override init() {        super.init()        maxPassengers = 2    }        override func description() -> String {        return super.description() + " ; " + "number of wheels \(numberofWheels) max speed \(maxSpeed)"    }}

看看Bicycle類中的description函數,這個函數就是重寫了vehicle類的description函數,用super.description來擷取父類的description函數。得到的結果是這樣的:

max passengers is 2 and manufacturer is Designed By Weasley;number of wheels 2 max speed 30.0

重寫屬性:

你可以重寫繼承來的執行個體屬性或類屬性,提供定製的getter和setter方法:

注意:如果你在重寫屬性中寫了 setter,那麼你也一定要寫 getter。如果你不想在重寫版本中的 getter 裡修改繼承來的屬性值,你可以直接返回 super.someProperty 來返回繼承 來的值。

class LimitSpeedBicycle: Bicycle {    override var maxSpeed : Double{        get{            return super.maxSpeed        }        set{            super.maxSpeed = min(maxSpeed, 20)        }    }    }


這裡重寫了maxSpeed屬性,當我們設定maxSpeed屬性的時候,跟20相比,返回一個最小值。
max passengers is 2 and manufacturer is Designed By Weasley ; number of wheels 2 max speed 20.0


重寫屬性觀察器:

我們可以在屬性重寫中為一個繼承來的屬性添加屬性觀察器,這樣一來當屬性發生變化的時候,我們就可以進行相應的操作。
注意:我們不可以為唯讀屬性和常量屬性添加屬性觀察器,因為常量和唯讀屬性不可以被設定的,所以沒法為他提供willset和didSet方法,看下面的例子:
class SpeedLevel: Bicycle {    var level  = 1    override var maxSpeed : Double{        didSet{            level = Int(maxSpeed / 10) + 1        }    }        override func description() -> String {        return super.description() + " level is \(level)"    }}var aBicycle = SpeedLevel()aBicycle.maxSpeed = 40println(aBicycle.description())


我們得到如下的輸出:
max passengers is 2 and manufacturer is Designed By Weasley ; number of wheels 2 max speed 40.0 level is 5


那麼問題來了,如果我不想我的屬性或者方法被重寫怎麼辦?
final關鍵字可以幫你解決這個問題:final var final class final func

歡迎大家共同指導學習。

【Swift初見】Swift繼承

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.