Domanda

Qualcuno può spiegare le differenze tra Protocolli e Categorie in Objective-C? Quando si utilizza uno sopra l'altro?

È stato utile?

Soluzione

Un protocollo è la stessa cosa come interfaccia in Java: è essenzialmente un contratto che dice, "Ogni classe che implementa questo protocollo sarà anche implementare questi metodi."

Una categoria, d'altra parte, appena si lega metodi per una classe. Per esempio, in cacao , posso creare una categoria per NSObject che mi permetterà di aggiungere metodi alla <=> di classe (e, naturalmente, tutte le sottoclassi), anche se io in realtà non hanno accesso a <=> .

Per riassumere: un protocollo specifica quali sono i metodi di una classe implementerà; una categoria aggiunge i metodi per una classe esistente.

L'uso corretto di ciascuno, quindi, dovrebbe essere chiaro: utilizzare protocolli di dichiarare un insieme di metodi che una classe deve implementare e utilizzare le categorie per aggiungere metodi a una classe esistente

Altri suggerimenti

Un protocollo dice: "qui ci sono alcuni metodi che mi piacerebbe si da implementare." Una categoria dice: "Sto estendere la funzionalità di questa classe con questi metodi aggiuntivi".

Ora, ho il sospetto che la vostra confusione deriva da uso di Apple della frase "protocollo informali". Ecco la chiave (e più confusione) Punto: un protocollo informale, non è in realtà un protocollo a tutti. In realtà è una categoria a NSObject. Cacao utilizza protocolli informali pervasivamente per fornire interfacce per i delegati. Dal momento che il @protocol sintassi non ha permesso metodi opzionali fino Objective-C 2.0, Apple ha implementato metodi opzionali per non fare niente (o restituire un valore fittizio) e metodi necessari per generare un'eccezione. Non c'era modo di far rispettare questo attraverso il compilatore.

Ora, con Objective-C 2.0, il @optional sintassi supporta la parola chiave @required, segnando alcuni metodi in un protocollo come optional. Così, la classe è conforme a un protocollo fintanto che implementa tutti i metodi contrassegnati come <=>. Il compilatore può determinare se la classe implementa tutti i metodi richiesti, troppo, che è un enorme risparmio di tempo. L'iPhone SDK utilizza esclusivamente il 2.0 <=> sintassi Objective-C, e non riesco a pensare a una buona ragione per non usarlo in qualsiasi nuovo sviluppo (tranne che per le applicazioni Mac OS X Cocoa che devono funzionare su versioni precedenti di Mac OS X).

Categorie:

Una categoria è un modo di aggiungere nuovi metodi per tutte le istanze di una classe esistente senza modificare la classe stessa.

Si utilizza una categoria quando si desidera aggiungere funzionalità a una classe esistente senza derivante da quella classe o ri-scrittura della classe originale.

Diciamo che si sta utilizzando NSView oggetti di cacao, e ti ritrovi a desiderare che tutte le istanze di #import sono stati in grado di eseguire una certa azione. Ovviamente, non si può riscrivere la classe <=>, e anche se si deriva da esso, non tutti gli <=> oggetti del programma sarà di vostro tipo derivato. La soluzione è quella di creare una categoria a <=>, che quindi si utilizza nel programma. Finché si <=> il file di intestazione che contiene la sua dichiarazione categoria, apparirà come se tutti <=> oggetto risponde ai metodi definiti nel file di origine catagory.

Protocolli:

Un protocollo è un insieme di metodi che ogni classe può scegliere di implementare.

Si utilizza un protocollo in cui si desidera fornire una garanzia che una certa classe risponderà ad uno specifico insieme di metodi. Quando una classe adotta un protocollo, che promette di implementare tutti i metodi dichiarati nel protocollo di intestazione. Ciò significa che qualsiasi altra classe che utilizzano tale classe possono essere certi che questi metodi saranno attuate, senza bisogno di conoscere anyting il resto della classe.

Questo può essere utile quando si crea una famiglia di classi simili che tutti devono comunicare con un comune "controllore" di classe. La comunicazione tra la classe controllore e le classi controllati possono tutti essere confezionato in un unico protocollo.

Nota a margine: il linguaggio Objective-C non supporta l'ereditarietà multipla (una classe può derivare solo da una superclasse), ma gran parte della stessa funzionalità può essere fornita da protocolli a causa di una classe possono essere conformi a diversi protocolli diversi

Per i miei Protocolli comprensione sono un po 'come interfacce di Java. Protocolli dichiarano i metodi, ma l'implementazione è fino a ciascuna classe. Categorie sembra essere qualcosa di simile a mixins di Ruby. Con le categorie è possibile aggiungere metodi alle classi esistenti. Anche le classi incorporate.

Un protocollo permette di dichiarare una lista di metodi che non si limitano a qualsiasi classe o categorie particolari. I metodi dichiarati nel protocollo possono essere adottati qualsiasi classe / categorie. Una classe o categoria che adotta un protocollo devono implementa tutti i metodi richiesti dichiarati nel protocollo.

Una categoria consente di aggiungere altri metodi per una classe esistente, ma non consentono ulteriori variabili di istanza. I metodi della categoria aggiunge diventano parte del tipo di classe.

I protocolli sono contratti per attuare i metodi specificati. Qualsiasi oggetto che è conforme a un protocollo si impegna a fornire implementazioni per quei metodi. Un buon uso di un protocollo potrebbe essere quella di definire una serie di metodi di callback per un delegato (in cui il delegato deve rispondere a tutti i metodi).

Categorie offrono la possibilità di estendere un oggetto corrente aggiungendo metodi ad esso (metodi di classe o istanza). Un buon uso di una categoria sarebbe estendendo la classe NSString per aggiungere funzionalità che prima non c'era, come l'aggiunta di un metodo per creare una nuova stringa che converte il ricevitore in 1337 5P34K.

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

Le definizioni da S.G.Kochan di "Programmazione in Objective-C":

Categorie:

Una categoria fornisce un modo semplice per voi per rendere modulare la definizione di una classe in gruppi o categorie di metodi correlati. Vi dà anche un modo semplice per estendere una definizione di classe esistente senza nemmeno avere accesso al codice sorgente originale per la classe e senza dover creare una sottoclasse.

Protocolli:

Un protocollo è un elenco di metodi che è condivisa tra le classi. I metodi elencati nel protocollo non hanno implementazioni corrispondenti; cui sono stati concepiti per essere attuato da qualcun altro (come te!). Un protocollo fornisce un modo per definire un insieme di metodi che sono in qualche modo collegati con un nome specificato. I metodi sono generalmente documentati in modo da sapere come sono da eseguire e in modo che sia possibile implementare nelle definizioni proprie di classe, se lo si desidera. Un elenco di protocollo una serie di metodi, alcuni dei quali si possono facoltativamente implementare, e altri che si sono tenuti a implementare. Se si decide di implementare tutti i metodi richiesti per un particolare protocollo, si dice che è conforme alla o adottare quel protocollo. Hai il permesso di definire un protocollo in cui tutti i metodi sono facoltativi, o quella in cui tutti sono necessari.

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