import Foundation /* 構造器的繼承: Swift的子類不會自動繼承父類的構造器, 若繼承, 則滿足如下規則: 1.如果子類沒有提供任何指定構造器, 那么它將自動繼承父類的所有指定構造器 2.如果子類實現了父類所有的指定構造器, 無論如何實現的, 都將自動繼承父類的所有便利構造器 */ /* 構造器的重寫: 1.子類構造器重寫了父類的指定構造器, 必須添加override修飾符 2.子類中定義的構造器只是和父類中便利構造器的形參列表, 外部形參名相同, 不算重寫 */ /* 總結: 1.如果一個子類沒有定義任何構造器, 那么它將自動繼承父類中的所有構造器 2.如果一個子類重寫父類的所有指定構造器, 那么它將自動繼承父類中的所有便利構造器 3.如果一個子類中任意的構造器和父類的便利構造器一模一樣, 不算重寫, 創建對象的時候也只會顯示子類定義的構造器 */ class Person { var name: String! var weight: Double init(name: String) { self.name = name self.weight = 0.0 } // 定義指定構造器 init(name: String, weight: Double) { self.name = name self.weight = weight } // 定義便利構造器(使用convenience修飾) convenience init(n name: String, w weight: Double) { // 便利構造器必須調用同類中的指定構造器 self.init(name: name, weight: weight) } convenience init(showStr: String) { self.init(name: "", weight: 0.0) print(showStr) } } class Man: Person { var sex: String = "男" override init(name: String) { // 子類的指定構造器中必須調用父類的指定構造器 super.init(name: name) self.name = name self.weight = 0.0 } override init(name: String, weight: Double) { super.init(name: name, weight: weight) self.name = name self.weight = weight } // 定義指定構造器與父類的便利構造器一樣, 這里不算重寫 convenience init(showStr: String) { self.init(name: "", weight: 0.0) print(showStr) } } var man = Man(name: "Rinpe", weight: 62.0) var man1 = Man(showStr: "HelloWorld")