Si definiscono i metodi nei protocolli in modo che il codice possa chiamare metodi implementati da altri. Il "contratto" tra voi e sviluppatori che implementano il protocollo di simile a questa:
- È definire il protocollo,
- Qualcun altro implementa il protocollo,
- Qualcun altro crea un oggetto che implementa il tuo protocollo, e te lo consegna, quindi
- puoi chiamare i metodi del tuo protocollo senza conoscerne l'implementazione.
Per chiamare i metodi del protocollo, è necessario disporre di un'istanza di un oggetto che la implementa. L'intero punto di definizione dei protocolli è la rimozione dal codice di qualsiasi conoscenza sulla classe che implementa il protocollo: se si conosce la classe che si otterrà, si potrebbe anche saltare il protocollo e programmare direttamente la classe. Tuttavia, se si desidera chiamare il proprio init
, è necessario conoscere la classe o qualcun altro deve passarvi un oggetto alloc
-ed sul quale non è stato ancora chiamato il numero init
. Nessuna delle due alternative è una buona idea: la prima uccide lo scopo di avere i protocolli, mentre la seconda forza i chiamanti di occuparsi di oggetti parzialmente inizializzati.
Nota che non impedisce di avere non init
metodi di configurazione in un protocollo: se tutti gli oggetti devono essere configurati utilizzando alcuni bit di informazioni, lasciate che i vostri utenti implementano qualunque init
che vogliono, e aggiungere un metodo per configureWith:...
il tuo protocollo, permettendoti di controllare il processo di configurazione dell'oggetto senza conoscere il suo metodo init
.
Potrebbe essere, che questa è una pratica normale, se non ** Qualcun altro ** crea l'oggetto che implementa l'interfaccia, ma ** You **? – SeriousBob
@SeriousBob Se si crea l'oggetto, si conosce il suo tipo, insieme a tutti i protocolli implementati. In questo caso, sapendo che 'init' (o per altro, qualsiasi altro metodo) fa parte di un protocollo non è più necessario. – dasblinkenlight
Ok, perché il protocollo NSCoding ha un initWithCoder: metodo? – SeriousBob