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

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top