在具有与基数相同的签名的初始化程序上要求“重写”的动机是什么?

时间:2018-08-06 14:56:07

标签: swift

对于方法来说,很明显,意外地重写方法可能会带来严重的后果,因此要求开发人员使用“ override”关键字来明确指出它是一个好主意。

但是,由于初始化程序是在类型(按原样)而不是对象上调用的,所以我不了解在这种情况下重写的含义,也不知道初始化程序中对“ override”关键字的要求是哪种错误预防。

1 个答案:

答案 0 :(得分:0)

我发现override修饰符仅提供一种方便和安全的功能,用于表达开发人员覆盖类的现有成员(当存在该修饰符时)或引入一个新的修饰符的意图(当缺少修饰符时),则编译器可以执行相应的编译时检查,并通知开发人员是否无法实现所表达的意图(因为没有要覆盖的内容,或者与其中一个定义的成员存在签名冲突)基类)。

您可以争辩说,覆盖虚拟成员或提供不同的静态分派的初始化程序来复制基类的初始化程序的签名是有区别的。从技术上讲,是的;但不是语义上的。从语义上讲,您可能仍想复制基类的初始化程序的签名,并且编译器已准备好执行相应的编译时签名检查。

Swift语言指南在标题为Initializer Inheritance and Overriding的“初始化”一章中说:

  

编写与超类指定的初始值设定项匹配的子类初始值设定项时,实际上是在提供该指定的初始值设定项的替代。因此,您必须在子类的初始化程序定义之前编写override修饰符。 ...

     

与覆盖的属性,方法或下标一样,override修饰符的存在会提示Swift检查超类是否具有匹配的指定初始化器要被覆盖,并验证覆盖的初始化器的参数是否已被覆盖。按预期指定。

从此摘录中,override修饰符的作用确实很小,即可以验证开发人员是否希望匹配基类的签名。