I protocolli Objective-C che imitano le avvertenze del compilatore di rese "funzioni virtuali"?
-
07-07-2019 - |
Domanda
In Objective-C, vorrei forzare le classi derivate per implementare una determinata interfaccia senza fornire un'implementazione predefinita (un'implementazione nella classe genitore).
Capisco che i protocolli possono essere usati per questo, e credo di capire come usare i protocolli, ma apparentemente mi manca qualcosa ...
Ho definito la classe Parent e derivato diverse classi Child da parent. Tutte le classi Child sono conformi a un protocollo che richiede l'implementazione di myMethod.
Vorrei scorrere le istanze Child, facendo riferimento a esse tramite il genitore della superclasse, chiamando myMethod su ciascuna.
Il compilatore - non a caso - avverte che Parent potrebbe non rispondere a myMethod.
Tutte le prove suggeriscono che myMethod sarà effettivamente chiamato per ciascuna delle istanze Child derivate, ma il fatto che riceva un avviso mi mette a disagio e suggerisce che non sto implementando correttamente.
Cosa mi sto perdendo?
Grazie
Soluzione
Non è così che devono essere usati i protocolli. Un protocollo è un'interfaccia senza implementazione. Se una classe afferma di essere conforme a un protocollo (come apparentemente fa la tua classe genitore), deve implementare i metodi o riceverai un avviso. Quello che vuoi fare è che tutte le classi che implementano effettivamente il protocollo dichiarino che sono conformi ad esso, e piuttosto che fare riferimento a loro con questo nome di classe genitore, fare riferimento a loro come id<ProtocolNameHere>
. Questo dichiara che sono oggetti conformi a quel protocollo.
Altri suggerimenti
Sto notando molto interesse per i protocolli e per come funzionano. Sfortunatamente, ci sono molti tutorial fuorvianti su di essi.
Guarda il mio tutorial Ereditarietà o Protocolli? su come funzionano i protocolli e quando usarli invece dell'ereditarietà. È incluso un sacco di codice di esempio e una discussione su come i protocolli possono essere usati piuttosto che le categorie come analoghi Objective-C alla classe astratta di altri linguaggi. Buona fortuna con il tuo sviluppo!