2014-10-10 11 views
7

Sto tentando di consentire a un metodo in una super classe di restituire un'istanza della sottoclasse in modo da poter utilizzare il metodo concatenato con metodi sia sul genitore che sul figlio.Restituire una sottoclasse dalla sua classe base in swift

Tuttavia, viene visualizzato l'errore "BaseClass non ha un membro denominato someOtherChainableMethod" quando tento di concatenare i metodi. Qui è il mio codice:

class BaseClass { 
    func someChainableMethod() -> BaseClass { 
     return self 
    } 
} 

class ChildClass: BaseClass { 
    func someOtherChainableMethod() -> ChildClass { 
     return self 
    } 
} 

let childClass = ChildClass 

childClass.someChainableMethod().someOtherChainableMethoid() 

Il problema sembra essere che il 'sé ritorno' nel metodo a catena in grado genitore sta tornando di un'istanza con tipo BaseClass piuttosto che ChildClass.

Ho anche provato questo con i generici e fallito, questo è quello che ho provato:

class BaseClass<T> { 
    func someChainableMethod() -> T { 
     return self 
    } 
} 

class ChildClass: BaseClass<ChildClass> { 
    func someOtherChainableMethod() -> ChildClass { 
     return self 
    } 
} 

let childClass = ChildClass 

childClass.someChainableMethod().someOtherChainableMethoid() 

In questo caso l'errore dal metodo BaseClasssomeChainableMethod, è "BaseClass non è convertibile a T".

risposta

8

Il tuo codice funziona se si cambia il tipo di ritorno dei metodi per Self:

class BaseClass { 
    func someChainableMethod() -> Self { 
     return self 
    } 
} 

class ChildClass: BaseClass { 
    func someOtherChainableMethod() -> Self { 
     return self 
    } 
} 

let childClass = ChildClass() 
let foo = childClass.someChainableMethod().someOtherChainableMethod() 
+0

Questo è esattamente ciò di cui ho bisogno, perfetto grazie! :) – user3067870

0

Aggiungi someOtherChaingableMethod nella classe base e ha lasciato un'implementazione vuota.

+0

Il problema è che alcuniAltroChaingableMeth Il metodo od è in realtà specifico per ChildClass. Ci sono più classi figlio con metodi specifici e non voglio inquinare la mia classe base con loro. – user3067870

+0

Oppure è possibile estrarre i metodi della catena in un protocollo, consentire a tutte le classi di implementare il protocollo e rispondere al protocollo nel metodo della catena. –

+0

Non è possibile ottenere ciò tramite l'ereditarietà, quindi la classe base non conosce i metodi della classe figlio. Inquina il metodo di tutte le catene per la tua classe base, puoi anche avere il polimorfismo. –

0

Dal momento che si sa già che ChildClass è un'istanza di ChildClass, si può fare

(childClass.someChainableMethod() as ChildClass).someOtherChainableMethoid() 
0

Semplicemente Override la classe base someChainableMethod

class BaseClass { 
    func someChainableMethod() -> Self{ 
     return self 
    } 
} 

class ChildClass: BaseClass { 
    override func someChainableMethod() -> Self { 
     return self 
    } 
    func A(){ 

    } 
} 

var objChild = ChildClass() 
objChild.someChainableMethod() 
Problemi correlati