问题
Override是子类的方便的初始化器,它会产生编译错误。
细节
我很难理解Swift (v4.1)为什么不让我覆盖我的方便初始化器。阅读这些文档,我发现这两条规则适用于我的问题:
如果您的子类没有定义任何指定的初始化器,则它会自动继承其所有超类指定的初始化器。 如果您的子类提供了其所有超类指定初始化器的实现--或者按照规则1继承它们,或者提供自定义实现作为其定义的一部分--那么它将自动继承所有超类方便初始化器。
在下面的代码中,我属于第一条规则,所有方便的初始化器都继承到ClassB中。此外,由于我继承了第一条规则中指定的所有初始化器,所以我还继承了所有方便的初始化器。
class ClassA<T> {
// This array would be private and not visible from ClassB
var array: [T]?
init() { }
convenience init(array: [T]) {
self.init()
self.array = array
}
}
class ClassB<T>: ClassA<T> {
var anotherArray: [T]?
// I feel like I should include the "override" keyword
// but I get a compiler error when "override" is added before "convenience init".
convenience init(array: [T]) {
self.init()
self.anotherArray = array
}
}
// Works fine
let instanceA = ClassA(array: [1, 2])
// Compile error when override is added:
// error: Initializer does not override a designated initializer from its superclass
// note: attempt to override convenience initializer here
// convenience init(array: [T]) {
// ^
let instanceB = ClassB(array: [1, 2])但是我不明白的是:ClassB有一个稍微不同的init(array:)实现,我想重写这个方便的初始化器。使用override关键字会产生编译错误。我是否错误地理解了这些初始化概念?
发布于 2014-08-15 07:39:29
相反,如果编写与超类方便初始化器匹配的子类初始化程序,则子类永远无法直接调用该超类便利性初始化器,这与上面在初始化器链接中描述的规则相同。因此,您的子类没有(严格地说)提供超类初始化器的覆盖。因此,在提供超类方便初始化器的匹配实现时,您不会编写
override修饰符。
但正如所写的,它似乎应该能工作-据我所知,这是一个编译器的错误。如果您将array参数的名称更改为ClassB的初始化程序(例如array2 ),则它将按预期工作。你应该归档雷达!
https://stackoverflow.com/questions/25322421
复制相似问题