为什么要在Swift类中使用所需的初始化程序?

为什么要在Swift类中使用所需的初始化程序?,第1张

概述我试图了解在Swift类中使用必需的关键字。 class SomeClass { required init() { // initializer implementation goes here }} 所需的并不强制我在我的子类中实现该方法。如果我想覆盖我父类所需的指定的初始化程序,我需要编写必需的而不是覆盖。我知道它是如何工作的,但不明白为什么我应该这样做。 我试图了解在Swift类中使用必需的关键字。 @H_404_1@class SomeClass { required init() { // initializer implementation goes here }}

所需的并不强制我在我的子类中实现该方法。如果我想覆盖我父类所需的指定的初始化程序,我需要编写必需的而不是覆盖。我知道它是如何工作的,但不明白为什么我应该这样做。

所需的好处是什么?
据我所知,像C#这样的语言没有这样的东西,只要重写就可以正常工作。

它实际上只是满足编译器的一种方式,以确保如果这个类有任何子类,它们将继承或实现这个相同的初始化程序。在这一点上存在疑问,因为规则是,如果一个子类具有自己的指定的初始化器,则不会继承超类的初始化器。因此,超类有可能具有初始化器,子类不具有初始化器。需要克服这种可能性。

编译器需要以这种方式满足的一种情况涉及协议,并且如下所示:

@H_404_1@protocol FlIEr { init()}class Bird: FlIEr { init() {} // compile error}

问题是如果Bird有一个子类,那个子类将必须实现或继承init,而且你没有保证。根据需要标记Bird的init可以保证。

或者,您可以将Bird标记为最终,从而保证相反,即它将永远不会有一个子类。

另一种情况是你有一个工厂方法,可以通过调用同一个初始化器来创建一个类或其子类:

@H_404_1@class Dog { var name: String init(name: String) { self.name = name }}class NoisyDog: Dog {}func dogMakerAndnamer(whattype: Dog.Type) -> Dog { let d = whattype.init(name: "FIDo") // compile error return d}

dogMakerAndnamer在Dog或Dog子类中调用init(name :)初始化器。但是编译器怎么能确保一个子类将有一个init(name :)初始化器?所需的指定使编译器的恐惧平静。

总结

以上是内存溢出为你收集整理的为什么要在Swift类中使用所需的初始化程序?全部内容,希望文章能够帮你解决为什么要在Swift类中使用所需的初始化程序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1054914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存