《從零開始學Swift》學習筆記(Day43)——建構函式繼承

智捷關東昇發表於2016-03-22

原創文章,歡迎轉載。轉載請註明:關東昇的部落格
  Swift中的子類建構函式的來源有兩種:自己編寫和從父類繼承。並不是父類的所有的建構函式都能繼承下來,能夠從父類繼承下來的建構函式是有條件的,如下所示。

  • 條件1:如果子類沒有定義任何指定建構函式,它將自動繼承所有父類的指定建構函式。
  • 條件2:如果子類提供了所有父類指定建構函式的實現,無論是通過條件1繼承過來的,還是通過自己編寫實現的,它都將自動繼承所有父類的便利建構函式。
      下面看示例程式碼:

    class Person {
    var name: String var age: Int

    func description() -> String {
    return "\(name) 年齡是: \(age)"
    }
    convenience init () {
    self.init(name: "Tony")
    self.age = 18
    }
    convenience init (name: String) {
    self.init(name: name, age: 18)
    }
    init (name: String, age: Int) {        
    self.name = name
    self.age  = age
    }
    

    }

    class Student: Person { var school: String init (name: String, age: Int, school: String) { self.school = school super.init(name: name, age: age) } convenience override init (name: String, age: Int) {
    self.init(name: name, age: age, school: "清華大學") } }

    class Graduate: Student {
    var special: String = "" }

      來看看符合條件1的繼承,Graduate繼承Student,Graduate類沒有定義任何指定建構函式,它將自動繼承所有Student的指定建構函式。符合條件1後,Graduate從Student繼承瞭如下指定建構函式:

    init (name: String, age: Int, school: String)

      再看符合條件2的繼承,由於Graduate實現了Student的所有指定建構函式,Graduate將自動繼承所有Student的便利建構函式。符合條件2後,Graduate從Student繼承瞭如下3個便利建構函式:

    init (name: String, age: Int) init (name: String) init ()

      Student繼承Person後有4個建構函式。
      條件1對Student不滿足,因為它有指定建構函式,Student類中的便利建構函式init (name: String, age: Int)滿足了條件2,它實現了父類指定建構函式init (name: String, age: Int)。另外,由於子類建構函式與父類建構函式引數相同,需要使用override關鍵字,表示子類建構函式重寫(overriding)了父類建構函式。
      由於Student類實現了父類指定建構函式,因此也繼承了父類的另外兩個便利建構函式。

歡迎關注關東昇新浪微博@tony_關東昇。 關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程資訊

enter image description here

更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com 智捷課堂論壇網站:http://51work6.com/forum.php

相關文章