2015-09-23 13 views
6

Sono di fronte a un problema relativo all'invio dei metodi dei protocolli.Invio metodo di estensione protocollo in Swift 2.0

Ho una gerarchia di classi che assomiglia a quello:

protocol E { 
    func test() 
} 

extension E { 
    func test() { 
     print("jello") 
    } 
} 

class A: E { 

} 

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

Ma quando chiamo test su un'istanza della classe B staticamente costretti a essere digitato A, "gelatina" viene stampato, non "ciao".

let b: A = B() // prints "jello" not "hello" 
b.test() 

mia comprensione è che test metodo di stampa "gelatina" viene "integrato" in casi di A (dal A conforme alle E protocollo). Fornisco quindi un'altra implementazione di test all'interno di B (che eredita il modulo A). Ho pensato che il polimorfismo avrebbe funzionato qui e chiamando test nell'istanza B che è stata memorizzata all'interno dei riferimenti A avrebbe stampato hello. Cosa sta succedendo qui?

E 'perfettamente funzionante quando non si utilizza qualsiasi protocollo:

class A { 
    func test() { 
     print("jello") 
    } 
} 

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

let b: A = B() // prints "hello" 
b.test() 

Cosa c'è di diverso di adottare un protocollo che aggiunge nuovi metodi per la mia classe padre e fornendo una nuova implementazione in una sottoclasse, di aver scritto direttamente questo metodo in la classe genitore e poi sovrascriverla in una sottoclasse?

Ragazzi, avete qualche soluzione?

+0

Non il comportamento preciso che si sta vedendo, ma strettamente correlato: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future –

risposta

3

Odora di insetto.

L'unica soluzione mi è venuta era molto brutto ...

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

Questa è davvero una soluzione , ma molto brutto :) Sarà archiviato un radar solo per essere sicuro. –

+0

Non è un bug, è un comportamento intenzionale. Nondimeno, sto combattendo con questo problema anche adesso :) – manmal

+0

@manmal Se Apple ha inteso questo, eppure tutti i programmatori lo trovano controintuitivo e finiscono per hackerare attorno ad esso, quindi penso che possa essere classificato come un bug. – mogelbuster

Problemi correlati