在Swift中禁用自动便利初始化器继承

时间:2017-03-23 09:08:52

标签: swift oop inheritance

我有一个类(比如Foo),它有两个初始值设定项,其中一个是指定的,另一个是convenience init。他们看起来像这样:

public class Foo {
    init(object: SomeObject) {
        self.object = object
        // Do something with object…
    }

    public convenience init() {
        self.init(object: SomeObject())
    }
}

BarFoo的子类,并且在调用SomeObject()指定的初始化程序之前更专业地配置Foo实例

public class Bar {
    public convenience init(arg: Arg) {
        let object = SomeObject(arg: arg)
        // Configure object…
        self.init(object: object)
    }
}

不幸的是,由于Bar符合Automatic Initializer Inheritance所需的所有条件,因此它还会继承Foo的{​​{1}}初始化程序,它不会指望任何参数。这对convenience没有意义,因为我前面提到的特殊行为发生在Bar方法中。

有没有办法禁用自动初始化程序继承?如果没有,是否可以将继承的convenience init更改为convenience init?如果这些都不可能,我也愿意重新思考类结构并以另一种方式进行。在这种情况下,如果需要,我还可以提供更多详细信息(例如privateFoo)。

1 个答案:

答案 0 :(得分:0)

我想出了如何修复它 - 解决方案是简单地从convenience的初始化程序中删除Bar关键字。由于这违反了自动继承的第一条规则,Bar不再继承Foo的便利init,但仍然可以调用Foo指定的init通过super.init(object: object)