Swift中构造器的继承和重写
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")