標籤: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繼承