为什么我们在Swift中覆盖初始值设定项?

时间:2016-12-24 08:22:46

标签: swift inheritance

来自Swift's documentation

  

与Objective-C中的子类不同,Swift子类不会继承   默认情况下,他们的超类初始值设定项。

然后它说:

  

编写与超类匹配的子类初始值设定项时   指定的初始化程序,您实际上提供了覆盖   指定的初始化程序。因此,您必须编写覆盖   子类的初始化定义之前的修饰符。

来自Java背景,其中构造函数不是继承的,我不明白这是如何工作的。为什么我们要覆盖默认情况下不会继承的初始值设定项?在我看来,像构造函数一样,初始化程序将隐式命名为类本身,并且可以在子类中重载(例如,Java中的类Dog只有名称为Dog的构造函数。但我不理解覆盖父初始化程序的想法。

1 个答案:

答案 0 :(得分:1)

子类可能不会“默认”继承它们的超类初始值设定项,但它们可以被继承(例如,如果你不提供任何指定的初始值设定项,你将自动继承超类的所有指定初始值设定项...参见{{ 3}})。

考虑名为Dog的{​​{1}}子类:如果您未在Chihuahua中实现任何指定的初始值设定项,则会自动继承Chihuahua初始值设定项,而不会在部分。但是,如果您确实需要因某些原因覆盖它,请执行此操作,只需从Dog指定的初始化程序中调用Dog指定的初始值设定项即可。如果您的Chihuahua初始值设定项与Chihuahua指定的初始值设定项具有相同的签名,则必须明确提供Dog关键字。