Frage

Ich möchte, dass ein Instanzvariablenobjekt ein Protokoll übernimmt.

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

Ich möchte zum Beispiel, dass mein Layer-Objekt das übernimmt <CocosNodeOpacity> damit ich die Methoden bekommen kann

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

kostenlos.Die oben gezeigte Syntax ist ungültig.Ist dies möglich, ohne eine neue Implementierungsdatei und ein benutzerdefiniertes Objekt zu erstellen?Danke.

War es hilfreich?

Lösung

Wenn es sich um alle Code handelt, die Sie erstellt haben, ist der beste Weg, dies zu tun, wahrscheinlich die Erstellung des Layer Die Klasse selbst übernimmt eher das Protokoll als die Variable.

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

Ein wesentlicher Vorteil für diesen Ansatz besteht darin, dass der Compiler prüft, ob Sie alle erforderlichen Methoden im Protokoll zur Kompilierungszeit implementiert haben, was im Allgemeinen das ist, was Sie wollen. Das Hinzufügen der Methoden an derselben Stelle wie der Rest der Standardklassenimplementierung ist leichter zu verstehen (keine Jagd, um herauszufinden, woher der magische Code stammt) und weniger zerbrechlich als die Verwendung von Kategorien (Hinzufügen der gleichen Methode über verschiedene Kategorien kann zu undefiniertem Verhalten führen). . In der Regel verwende ich nur Kategorien, wenn ich haben zu, wie das Hinzufügen von Methoden zum (geschlossenen) Code von Drittanbietern.

Wenn Sie die Quelle von nicht steuern Layer, Möglicherweise müssen Sie dies stattdessen verwenden, wenn Sie Ihren IVAR deklarieren:

Layer<CocosNodeOpacity> *content;

Beachten Sie, dass Sie die Übernahme eines Protokolls ermöglicht, Variablen mit einem Klassentyp statisch einzugeben und Warnungen zu kompilieren, wenn die Methoden nicht vorhanden sind. Sie erhalten jedoch nicht die Methoden "kostenlos", da Sie sie noch implementieren müssen. Trotzdem kann der vernünftige Gebrauch von Protokollen und statischer Tippen Ihren Code robuster und "fehlgeschlagener" machen als verwendet als die Verwendung id als Typ für alles. Sie sind dafür zu loben, dass Sie nicht nur den einfachen Ausweg genommen haben. :-)

Einige Details zu Protokollen (einschließlich der erforderlichen und optionalen Methoden) finden Sie unter Diese Antwort.

Andere Tipps

Ein Protokoll in Objective-C ähnelt einer Schnittstelle in Java.Das Protokoll definiert eine Reihe von Funktionen und fungiert als Vertrag.Es ist, als würde man sagen: „Ich garantiere, dass dieses Objekt, was auch immer es ist, über diese Methoden verfügt.“

Sie sind der Syntax Ihres ersten Codeblocks ziemlich nahe gekommen.Eigentlich würde es etwa so aussehen:

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

Das erspart Ihnen jedoch nicht die Notwendigkeit, die Methoden für die Deckkraft in Ihrer Layer-Klasse zu definieren.Mithilfe des Protokolls haben Sie festgestellt, dass Ihre Klasse über diese Funktionen verfügt, Sie haben sie jedoch nicht tatsächlich bereitgestellt.Sie müssen noch den Code für sie schreiben.

Ich denke, was Sie suchen, ist eine Objective-C-Kategorie.Eine Kategorie bietet eine Möglichkeit, die Funktionalität einer beliebigen Klasse zu erweitern, indem ihr zur Laufzeit Methoden hinzugefügt werden.Sie sind möglich, weil Objective-C eine vollständig dynamische Sprache ist.Wenn Sie nicht der Autor der Layer-Klasse sind und die Deckkraftmethoden nicht einfach hinzufügen können, ist eine Kategorie die richtige Wahl.In manchen Fällen sind Kategorien äußerst nützlich – Sie können Methoden zu integrierten Klassen wie NSString und NSColor hinzufügen, ohne über die vorhandene Klassenquelle zu verfügen.

Hier zum Stapelüberlauf gibt es zahlreiche Dokumentationen für Kategorien.Die Apple-Dokumente sind auch sehr gut.Hier ist ein Artikel, der Ihnen den Einstieg erleichtern soll:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top