iOS必须SwiftiOS DeveloperiOS 开发

swift 9: 父类的构造器重写、required关键字

2016-08-13  本文已影响980人  前进的苏辰

1重写父类的构造器

class Person{
    var name: String
    var color: String
    
    //指定构造器
    init(name: String, color: String){
        self.name = name
        self.color = color
    }
    
    init(){
        self.name = "小明"
        self.color = "小黄人"
    }
    
    //便利构造器
    convenience init(name:String){
        self.init(name: name, color: "黑人")
    }
}

//对父类的构造器进行重写

class Man: Person {
    var height: Double
    
    //如果子类方法和父类方法同名,编译器默认它为重写方法
    override init(name: String, color: String) {
        //对自身的属性进行初始化
        height = 1.80
        
        //调用父类的构造方法对从父类继承的属性进行初始化
        super.init(name: name, color: color)
    }
    
    override init() {
        height = 1.75
        super.init(name: "小花", color: "白人")
    }
    
    //子类永远不能直接访问父类中的便利构造器,所以此处定义的构造方法不是重写方法
    init(name: String){
        height = 1.70
        super.init()
        self.color = "yellow"
        self.name = "Lilei"
    }
}

var m = Man(name: "hello", color: "world")

2required关键字

1:required关键字,只能用于修饰构造方法

2: 【提问】 继承中required修饰的构造方法是否是必须实现的方法?

class Fruit{
    var name: String
    
    required init(name: String){
        self.name = name
    }
    
    required convenience init(){
        self.init(name: "水果")
    }
class Pear: Fruit {
    var weight: Double = 0.0
}
//1.当子类没实现任何构造方法,编译器就会认为子类可以使用父类中的所有指定构造器,required修饰的构造方法在子类中可以不写
var xpear = Pear.init(name: "梨")


//2.当子类中定义了异于父类中的构造方法(参数名称不同、参数个数不同、参数类型不同),
//那么父类中使用required修饰的构造方法在子类中必须实现,而且这个方法必须使用required关键字而不能使用override修饰
class Apple: Fruit {
    var sweet: String = ""
    
    init(sweet:String){
        self.sweet = sweet
        super.init(name: "apple")
    }
    
    required init(name: String) {
        self.sweet = ""
        super.init(name: name)
    }
}
上一篇 下一篇

猜你喜欢

热点阅读