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

  

posted @ 2016-02-14 15:30  Rinpe  阅读(3242)  评论(0编辑  收藏  举报