在Swift中,子类的构造函数有两种来源,首先是自己拥有的构造函数,其次是从父类中继承过来的构造函数。但是,并不是所有父类构造函数都能够被子类继承。子类继承父类的构造函数是有条件的,遵守以下2个规则:
规则1——如果子类没有定义任何指定构造函数,它会自动继承父类所有指定构造函数
规则2——如果子类提供了所有父类指定构造函数的实现(通过规则1继承来的或者提供自定义实现的),那么它会自动继承所有父类便捷初始化器
如果一个子类中任意的构造器和父类的便利构造器一模一样, 不算重写
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 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) {
self.sex = "女"
// 子类的指定构造函数中必须调用父类的构造函数
// 重写的时候,必须将调用父类的构造函数语句放在调用父类属性的前面
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 manA = Man(name: "ZhangSan", weight: 62.0)
var manB = Man(showStr: "Hello Swift")