2013-05-29 13 views
7

ieri un collega ha chiesto, perché non dovremmo dichiarare un metodo init (initWith ...: (...)) in un protocollo per forzare l'implementazione delle classi per fornire un tale inizializzatore. Ero abbastanza sorpreso da quella domanda e, a mio modo di vedere, questa è una sciocchezza. Ma non sono riuscito a trovare un motivo definitivo, ma che dichiarare un metodo init in un protocollo porta a una minore flessibilità per le implementazioni.obiettivo c init nel protocollo

Potrebbe dirmi una buona ragione, perché non dovrebbe o non dovrebbe essere un metodo init in un protocollo?

Grazie!

risposta

6

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.

+0

Potrebbe essere, che questa è una pratica normale, se non ** Qualcun altro ** crea l'oggetto che implementa l'interfaccia, ma ** You **? – SeriousBob

+0

@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

+0

Ok, perché il protocollo NSCoding ha un initWithCoder: metodo? – SeriousBob

3

Conosco alcuni protocolli in iOS SDK che ha init ... metodi. Ad esempio, il protocollo NSCoding ha - initWithCoder: metodo richiesto. Penso che sia una pratica normale.