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