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")