【问题标题】:Can a subclass not inherit the superclass' initializer and when do we use the required initializer?子类可以不继承超类的初始化程序吗?我们什么时候使用所需的初始化程序?
【发布时间】:2020-07-23 20:01:13
【问题描述】:

required 修饰符是 "to indicate that every subclass of the class must implement that initializer"

class SomeClass {
    required init() {
        // initializer implementation goes here
    }
}

这意味着子类不必继承超类的初始化器。事实上,Stackoverflow answer 表示如果子类有自己的指定初始化程序,那么它不必继承超类的初始化程序。

不过,Swift documentation 表示每个类都必须有至少一个指定的初始化程序,它“调用适当的超类初始化程序以继续沿超类链的初始化过程。”

我的问题是:

  1. 子类能否不继承超类的初始化程序,如果可以,在什么情况下不继承它是有益的?
  2. 所需的初始化程序究竟做了什么?在什么情况下满足初始化程序继承要求是必要的?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    尝试从初始化对对象的作用来考虑它。它将值设置为尚未设置值但需要在使用前设置值的参数。请参阅:https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID228。因此,每个类都需要有一种方法来初始化它,并在必要时处理设置变量或沿子类链传递该责任。所需的 init() 函数应用作一种独特的情况,即在初始化链中的某处,在超类的所需 init() 中计算/设置特殊属性,这使得在子类中调用所需的 init() 成为必需/它的子类。在这种情况下,您不需要编写所需的覆盖。

    【讨论】:

    • 不加required修饰符的super.init()能达到同样的效果吗?
    • 技术上是的,但是要求它是强制性的,并且在超类被抽象或不可见时很有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多