Swift类构造器的继承和重写

继承

Swift中默认情况下,子类不会自动继承父类的构造器,只有在安全和适当的情况下,子类会自动继承父类的构造器。
安全适当的情况是指:(官方的表述是有错误的),第二条并不是必须子类的属性要有默认值,在实现的构造器中,子类完成自己的属性初始化就行

  • 子类中的新属性都有默认值,子类没有定义任何指定构造器,子类将自动获得所有父类的指定构造器
  • 子类实现了父类所有的指定构造器(不一定是重写,继承的也算),子类将自动获得父类的所有便利构造器

第一条很好理解,子类没有指定构造器并且自己的属性都有默认值,所以直接调用父类的指定构造器就可以完成初始化,所以会继承

第二条也很好理解,子类实现了父类的所有指定构造器,子类获得的便利构造器,可以保证子类实例初始化,因为,这些便利构造器最终要调用到本类中的指定构造器,因为子类重写了所有父类指定构造器,所有继承来的便利构造器最终在子类中一定可以找到指定构造器完成完全初始化

第一种情况

class A{
    var a:Int
    init(a:Int) {
        self.a = a
    }
    convenience init() {
        self.init(a:1)
    }
}

class B: A {
    var b = 2
}

var b1 = B(a: 1)//类B中的b有默认值2,所以获得类A中的指定构造器init(a:int)
var b2 = B()//类B实现了类A中的init(a:Int),所以会得到类A的便利构造器init()
class A{
    var a:Int
    init(a:Int) {
        self.a = a
    }
    convenience init() {
        self.init(a:1)
    }
}

class B: A {
    var b:Int
    override init(a:Int){
        self.b = 1
        super.init(a:a)
    }
}

var b = B(a: 1)
var b2 = B()

重写

如果在子类中有和父类一样的构造器,子类构造器必须加上override关键字,因为此时你在重写父类的构造器。

那么编译器如何认为两个构造器是否相同?
即原型相同,原型包含名称和参数表,名称都是init,不用考虑,参数表是指参数个数,参数类型,参数顺序,还有参数标签,只有都相同才认为是相同的构造器

另外需要注意的一点是,子类的构造器和父类的便利构造器相同的时候,不叫重写,不须加override关键字,因为在子类中无法调用父类的便利构造器,所以这不是重写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容