swift一步步学习Swift

Swift学习之初始化器的重写和继承

2020-08-14  本文已影响0人  冷武橘

一、初始化器的重写

1、子类重写父类的指定初始化器
class Person {
    init(age:Int) {
    }
}

class student :Person{
    override init(age:Int) {
        super.init(age: 20)
    }
}
class Person {
    init(age:Int) {
    }
}

class student :Person{
    init(age:Int,score:Int) {
        super.init(age: 20)
    }
    convenience override init(age: Int) {
        self.init(age:20,score:40)
    }
}

2、子类写了一个匹配父类的便捷初始化器

class Person {
    init(age:Int) {

    }
    
    convenience init(weight:Int){
        self.init(age: 20)
    }
}

class student :Person{
    init(age:Int,score无法:Int) {
        super.init(age: 20)
    }
    
    convenience init(weight: Int) {
        self.init(age:20,score:40)
    }
}

二、初始化器的自动继承


class Person {
    
    init(age:Int) {
        print(“年龄”)
    }
    
    init(weight:Int) {
  
    }
    init(weight:Int,age:Int) {
    }
}
class student :Person{
}
let p = Person(age: 12)
let p1 = Person(weight: 20)
let p2 = Person(weight: 20, age: 10)

子类只要自定义了,就不会继承了。

通过继承:

class Person {
    
    init(age:Int) {
        print(“年龄”)
    }

    convenience init(sex:String){
        self.init(age:30)
    }
}

class Student :Person{

}
let s = Student(sex:”男”)

通过重写:

class Person {
    
    init(age:Int) {
        print(“年龄”)
    }

    convenience init(sex:String){
        self.init(age:30)
    }
    
}

class Student :Person{
    override init(age: Int) {
        super.init(age: 20)
    }
}
let s = Student(sex:”男”)
class Person {
    
    init(age:Int) {
        print(“年龄”)
    }

    convenience init(sex:String){
        self.init(age:30)
    }
    
}

class Student :Person{
    init() {
        super.init(age: 20)
    }
    
    convenience override init(age: Int) {
        self.init()
    }
}

let s = Student(sex:”男”)

三、required

用required修饰的指定初始化器,表明其所有子类都必须实现(通过继承或者重写)

class Person {
    required init(){
        
    }
}
class Student:Person{
    
}
class Person {
    required init(weight:Float){
        
    }
}

class Student:Person{
    init(age:Int) {
        super.init(weight: 12.0)
    }

    required init(weight: Float) {
  
        super.init(weight: 44)
        
    }
}

三、属性观察器

父类的属性在它自己的初始化器中赋值不会触发属性观察器,但在子类的初始器中会触发属性观察器


class Person {
    var age: Int{
        willSet{
            print("willSet",newValue)
        }
        didSet{
            print("didSet",oldValue)
        }
    }
    
    init() {
        self.age = 0
    }
    
}

class Student:Person{
    override init() {
        super.init()
        self.age = 10
    }
}
let s = Student()
上一篇 下一篇

猜你喜欢

热点阅读