首页 文章

泛型类型的初始化器不会在swift中继承吗?

提问于
浏览
6

这是我的代码:

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 回答

  • 1

    那个怎么样 ??我尝试使用覆盖代码和super.init,这不是错误 . 我认为您不必使用泛型类型的init函数 .

    尝试在类B和类C中放置重写init函数 . 看起来像这样,

    public override init(n:Int) { super.init(n: n) }

  • 0

    您现在编译失败的代码(自Swift 3起) . Swift 3 Language changes中没有提到这种变化,所以我只能假设这是一个错误 .

相关问题