2015-09-23 2 views
6

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?

+0

Nicht das genaue Verhalten, das Sie sehen, aber eng verwandt: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future –

Antwort

3

Riecht wie ein Käfer.

Die einzige Abhilfe, die ich mit sehr hässlich ...

war kam
protocol E { 
    func test() 
} 

func E_test(_s: E) { 
    print("jello") 
} 

extension E { 
    func test() { E_test(self) } 
} 

class A: E { 
    func test() { E_test(self) } 
} 

class B: A { 
    override func test() { 
     print("hello") 
    } 
} 

let b: A = B() 
b.test() 
+0

Dies ist in der Tat eine Lösung , aber sehr hässlich :) Wird ein Radar nur um sicherzustellen, dass. –

+0

Es ist kein Fehler, es ist ein beabsichtigtes Verhalten. Nichtsdestoweniger kämpfe ich gerade mit diesem Problem :) – manmal

+0

@manmal Wenn Apple dies beabsichtigte, aber alle Programmierer finden es nicht intuitiv und am Ende hacken um es herum, dann denke ich, dass es als ein Fehler eingestuft werden kann. – mogelbuster