【问题标题】:Swift Inheritance v.s calling superSwift 继承与调用 super
【发布时间】:2016-06-24 17:43:35
【问题描述】:

我正在学习 The Swift Programming Languages 中的以下章节:

如果您的子类没有定义任何指定的初始化器,它会自动继承其所有超类的指定初始化器。

然后我在我的目标中尝试了这些代码:

class Car {
    var name: String = "Unknown"
    init(name: String) {
        self.name = name
    }
}
class RacingCar: Car {
    var speed = 0.0
    init(name: String, speed: Double) {
        self.speed = speed
        super.init(name: name)//this is where I got confused
    }
}

根据规则一,RacingCar 类不会从其超类 Car 继承 init(name:) 指定的初始化程序。但是,我仍然可以在我的子类中调用 super.init(name:)。怎么会这样?我对此感到很困惑。谁能解释为什么?谢谢。

【问题讨论】:

    标签: swift inheritance super initializer


    【解决方案1】:

    继承一个初始化器意味着该初始化器可用于您的子类的实例(这就是继承的意思);也就是说,您的子类的初始化程序可以在 self 上调用它:

    class RacingCar: Car {
        var speed = 0.0
        init(name: String, speed: Double) {
            self.speed = speed
            self.init(name: name) // <-- Error: This initializer is not inherited
        }
    }
    

    您无需继承初始化程序即可在 super 上调用它:超类不会因为您将其子类化而失去对其初始化程序的访问权限。

    class RacingCar: Car {
        var speed = 0.0
        init(name: String, speed: Double) {
            self.speed = speed
            super.init(name: name) // <-- Works: super class does have this initializer
        }
    }
    

    【讨论】:

    • 感谢您的帮助。这是有道理的,但我还有一个问题。超类中定义的所有方法和属性都可用于子类吗?@NicolasMiari
    • 是的,除非它们被声明为private。但即便如此,如果超类和子类都定义在同一个文件中,它们仍然可用(在 swift 中,访问控制是基于源文件的)
    • 关于 initializers 有一些特殊规则(就像您在问题中提到的那样),但其他方法会自动继承。
    • 再次感谢。很高兴有你在这里。@NicolasMiari
    • 我自己对 swift 也还是很陌生,我的回答可能不是 100% 正确的。我建议你在接受之前稍等片刻。可能会出现更值得的东西。
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多