这是我的代码:
public class A<T : Any> {
public init(n : Int) {
print("A")
}
}
public class B : A<Int> {
}
public class C : B {
}
let x = C(n: 123)
这无法编译并大喊这样的错误:
repl.swift:9:9: error: 'C' cannot be constructed because it has no accessible initializers
可以编译以下代码 .
public class A {
public init(n : Int) {
print("A")
}
}
public class B : A {
}
public class C : B {
}
let x = C(n: 123)
Shouldn't requirement types specified generic types' initializers be inherited?
========以下附加内容=======
“超类初始化器在某些情况下是继承的,但只有在安全且适当的情况下才会继承 . 有关更多信息,请参阅下面的“自动初始化程序继承” . “--- Apple Inc.”Swift编程语言(Swift 2)“iBooks .
还有这个
“但是,如果满足某些条件,则会自动继承超类初始值设定项 . ”“假设您为在子类中引入的任何新属性提供默认值,则适用以下两个规则:”规则1“如果您的子类未定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项 . “规则2”如果您的子类提供了所有超类指定初始值设定项的实现 - 通过按照规则1继承它们,或者通过提供自定义实现作为它的定义 - 然后它自动继承所有超类便利初始化器 . “
当查看第一个代码时,子类 B
没有定义任何指定的初始值设定项,它应该自动继承它的所有超类指定的初始值设定项,来自 A<Int>
. 但实际上并没有看到它连接到我 .
2 回答
那个怎么样 ??我尝试使用覆盖代码和super.init,这不是错误 . 我认为您不必使用泛型类型的init函数 .
尝试在类B和类C中放置重写init函数 . 看起来像这样,
public override init(n:Int) { super.init(n: n) }
您现在编译失败的代码(自Swift 3起) . Swift 3 Language changes中没有提到这种变化,所以我只能假设这是一个错误 .