2015-12-30 12 views
6

Oto mój kod:Inicjatory typów ogólnych nie odziedziczą szybko?

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) 

To nie kompilację i krzyczy taki błąd:

repl.swift:9:9: error: 'C' cannot be constructed because it has no accessible initializers 

Poniższy kod może zostać skompilowany.

public class A { 
    public init(n : Int) { 
     print("A") 
    } 
} 
public class B : A { 
} 
public class C : B { 
} 
let x = C(n: 123) 

nie powinien typy wymogi wymienione inicjalizatory RODZAJE być dziedziczone?

======== ======= dodatkowe Poniżej

“Superclass initializers are inherited in certain circumstances, but only when it is safe and appropriate to do so. For more information, see Automatic Initializer Inheritance below.”
---Apple Inc. “The Swift Programming Language (Swift 2)” iBooks.

A to

“However, superclass initializers are automatically inherited if certain conditions are met.”

“Assuming that you provide default values for any new properties you introduce in a subclass, the following two rules apply:” Rule 1 “If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.” Rule 2 “If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.”

Patrząc na pierwszego kodu, podklasa B nie robi Zdefiniuj wszelkie wyznaczone inicjalizatory, powinno automatycznie dziedziczyć wszystkie jego nadklasy wyznaczone inicjalizatory, te z A<Int>. Ale tak naprawdę nie, które wydaje się być podłączone do mnie.

+1

Zaobserwowano również tutaj: http://stackoverflow.com/questions/31040044/swift-generic-superclass-init-not-accesible-when-construcing-its-subclass. –

+0

ktoś złożył bilet w szybkim jirku https://bugs.swift.org/projects/SR/issues/SR-416 –

+0

@AnthonyKong Tak, to ja. – AntiMoron

Odpowiedz

1

Co z tym? Próbuję użyć kodu przesłaniania i super.init, to nie jest błąd. Myślę, że nie musisz inicjować funkcji o typach ogólnych.

spróbować umieścić funkcję nadpisywania startowy w klasie B i klasy C. wyglądać tak,

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

Powiązane problemy