这是我的代码:
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)不应该继承指定的泛型类型的初始化器吗?
========Additional Below=======
“超类初始化程序在某些情况下是继承的,但只有在安全和适当的情况下才会继承。有关详细信息,请参阅下面的自动初始化程序继承。“ -苹果公司“Swift编程语言(Swift 2)”iBooks。
还有这个
“但是,如果满足某些条件,超类初始化程序将自动继承。” “假设您为子类中引入的任何新属性提供默认值,则适用以下两条规则:” rules 1“如果您的子类没有定义任何指定的初始化器,则它会自动继承其所有超类指定的初始化器。如果您的子类提供了其所有超类指定初始化器的实现--或者按照规则1继承它们,或者提供自定义实现作为其定义的一部分--那么它将自动继承所有超类指定的初始化器。”
当查看第一段代码时,子类B没有定义任何指定的初始化器,它应该自动继承其所有超类指定的初始化器,那些来自A<Int>.But的子类--实际上它没有--这在我看来似乎是连线的。
发布于 2015-12-30 09:46:19
那怎么样??我尝试使用覆盖代码和super.init,这不是错误,我认为您不必使用泛型类型。
在B类和C类中加入重写init函数,如下所示,
public override init(n:Int) { super.init(n: n) }
发布于 2016-11-17 09:24:17
失败的代码现在编译(从Swift 3开始)。Swift 3语言变化中没有提到这个更改,所以我只能假设这是一个bug。
https://stackoverflow.com/questions/34525368
复制相似问题