Ich habe ein Problem in Bezug auf Protokolle Methoden Versand.Protokoll-Erweiterung Methode Versand in Swift 2.0
Ich habe eine Klassenhierarchie, die so aussieht:
protocol E {
func test()
}
extension E {
func test() {
print("jello")
}
}
class A: E {
}
class B: A {
func test() {
print("hello")
}
}
Aber wenn ich test
auf eine Instanz der Klasse nennen B
statisch typisiert werden A
gezwungen, „Jello“ gedruckt wird, nicht „Hallo“.
let b: A = B() // prints "jello" not "hello"
b.test()
Mein Verständnis ist, dass test
Verfahren printing "jello" wird "integriert" in Fällen von A
(da A
zu E
Protokoll entspricht). Ich gebe dann eine andere Implementierung von test
innerhalb B
(das Formular A
erbt). Ich dachte Polymorphismus würde hier arbeiten und test
auf B
Instanz aufrufen, die in A
Referenzen gespeichert werden, würde hello
drucken. Was passiert hier?
Es ist perfekt funktioniert, wenn kein Protokoll:
class A {
func test() {
print("jello")
}
}
class B: A {
override func test() {
print("hello")
}
}
let b: A = B() // prints "hello"
b.test()
Was anders ist, ein Protokoll von der Annahme, dass neue Methoden zu meiner Eltern-Klasse fügt und eine neue Implementierung in einer Unterklasse bereitstellt, als diese Methode direkt geschrieben zu haben in die Elternklasse und überschreibt sie dann in einer Unterklasse?
Haben Sie eine Workaround?
Nicht das genaue Verhalten, das Sie sehen, aber eng verwandt: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future –