Domanda

Vorrei che un oggetto variabile di istanza adottasse un protocollo.

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer *content <CocosNodeOpacity>;
}

Ad esempio, vorrei che il mio oggetto Layer adottasse il file <CocosNodeOpacity> in modo da poter ottenere i metodi

-(GLubyte) opacity;    //and
-(void) setOpacity: (GLubyte) opacity;

gratuito.La sintassi mostrata sopra non è valida.È possibile ottenere questo risultato senza creare un nuovo file di implementazione e creare un oggetto personalizzato?Grazie.

È stato utile?

Soluzione

Se tutto questo è il codice che hai creato, il modo migliore per farlo è probabilmente creare il file Layer la classe stessa adotta il protocollo, anziché la variabile.

@interface Layer : NSObject <CocosNodeOpacity> { ... }

Un vantaggio chiave di questo approccio è che il compilatore controllerà se sono stati implementati tutti i metodi richiesti nel protocollo in fase di compilazione, che in genere è ciò che desideri.Aggiungere i metodi nello stesso posto del resto dell'implementazione della classe standard è più facile da capire (non è necessario cercare da dove proviene il codice magico) e meno fragile rispetto all'utilizzo delle categorie (l'aggiunta dello stesso metodo tramite categorie diverse può comportare un comportamento indefinito) .Come regola generale, utilizzo le categorie solo quando I Avere a, come l'aggiunta di metodi al codice di terze parti (a codice chiuso).

Se non controlli la fonte di Layer, potresti dover utilizzare questo invece quando dichiari il tuo ivar:

Layer<CocosNodeOpacity> *content;

Tieni presente che l'adozione di un protocollo ti consente di digitare staticamente variabili con un tipo di classe e ricevere avvisi di compilazione se i metodi non sono presenti.Tuttavia, i metodi non vengono forniti "gratuitamente", poiché è necessario implementarli ancora.Tuttavia, un uso giudizioso dei protocolli e della digitazione statica può rendere il codice più robusto e "fail-fast" rispetto all'utilizzo id come tipo per ogni cosa.Devi essere lodato per non aver scelto solo la via più facile.:-)

Per alcuni dettagli sui protocolli (compresi i metodi obbligatori e facoltativi) vedere questa risposta SO.

Altri suggerimenti

Un protocollo in Objective-C è simile a un'interfaccia in Java. Il protocollo definisce un insieme di funzioni e funge da contratto. È come dire & Quot; Garantisco che qualunque sia questo oggetto, ha questi metodi. & Quot;

Sei abbastanza vicino alla sintassi nel tuo primo blocco di codice. In realtà sarebbe simile a questo:

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer<CocosNodeOpacity> * content;
}

Tuttavia, ciò non ti impedisce di dover definire i metodi per l'opacità nella tua classe Layer. Usando il protocollo, hai stabilito che la tua classe avrà quelle funzioni, ma non le hai effettivamente fornite. Dovrai comunque scrivere il codice per loro.

Penso che quello che stai cercando sia una categoria Objective-C. Una categoria fornisce un modo per estendere la funzionalità di qualsiasi classe aggiungendo metodi durante l'esecuzione. Sono possibili perché Objective-C è un linguaggio completamente dinamico. Se non sei l'autore della classe Layer e non riesci ad aggiungere facilmente i metodi di opacità, una categoria è la strada da percorrere. In alcuni casi, le categorie sono estremamente utili: puoi aggiungere metodi alle classi integrate, come NSString e NSColor, senza avere l'origine della classe esistente.

C'è molta documentazione per le categorie qui in overflow dello stack. I documenti di Apple sono anche molto buoni. Ecco un articolo per iniziare:

http://macdevelopertips.com/objective-c/objective-c -categories.html

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