2

インスタンス変数オブジェクトにプロトコルを採用してほしい。

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

たとえば<CocosNodeOpacity>、メソッドを取得できるように、Layer オブジェクトに を採用させたいと思います

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

無料で。上記の構文は無効です。新しい実装ファイルを作成してカスタム オブジェクトを作成せずにこれを達成することは可能ですか? ありがとう。

4

2 に答える 2

5

これらがすべてあなたが作成したコードである場合、これを行う最善の方法はLayer、変数ではなく、クラス自体にプロトコルを採用させることです。

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

このアプローチの主な利点は、コンパイル時にプロトコルに必要なすべてのメソッドが実装されているかどうかをコンパイラがチェックすることです。これは通常、必要なことです。標準クラスの実装の残りの部分と同じ場所にメソッドを追加すると、理解が容易になり (魔法のコードがどこから来たのかを探す必要がなくなります)、カテゴリを使用するよりも壊れにくくなります (異なるカテゴリを介して同じメソッドを追加すると、未定義の動作が発生する可能性があります)。 . 原則として、(クローズド ソースの) サードパーティ コードにメソッドを追加するなど、必要な場合にのみカテゴリを使用します。

のソースを制御しない場合はLayer、ivar を宣言するときに代わりにこれを使用する必要がある場合があります。

Layer<CocosNodeOpacity> *content;

プロトコルを採用すると、クラス型で変数を静的に型付けし、メソッドが存在しない場合にコンパイル警告を受け取ることができることに注意してください。ただし、メソッドを実装する必要があるため、「無料で」メソッドを取得することはできません。idそれでも、プロトコルと静的型付けを賢明に使用すると、すべての型として使用するよりも、コードをより堅牢で "フェイル ファスト" にすることができます。安易な道を選ばないことは称賛に値します。:-)

プロトコルの詳細 (必須およびオプションのメソッドを含む) については、この SO answerを参照してください。

于 2009-06-23T21:51:01.710 に答える
2

Objective-C のプロトコルは、Java のインターフェイスに似ています。プロトコルは一連の機能を定義し、コントラクトとして機能します。「このオブジェクトが何であれ、これらのメソッドがあることを保証します」と言っているようなものです。

最初のコード ブロックの構文にかなり近づいています。実際には次のようになります。

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

ただし、Layer クラスで不透明度のメソッドを定義する必要がなくなるわけではありません。プロトコルを使用して、クラスにこれらの関数があることを確立しましたが、実際にはそれらを提供していません。それらのコードを記述する必要があります。

あなたが探しているのは、Objective-C のカテゴリだと思います。カテゴリは、実行時にメソッドをクラスに追加することで、任意のクラスの機能を拡張する方法を提供します。Objective-C は完全に動的な言語であるため、これらが可能です。Layer クラスの作成者ではなく、opacity メソッドを簡単に追加できない場合は、カテゴリを使用することをお勧めします。場合によっては、カテゴリが非常に便利です。既存のクラス ソースがなくても、NSString や NSColor などの組み込みクラスにメソッドを追加できます。

ここには、スタック オーバーフローに関するカテゴリのドキュメントがたくさんあります。アップルのドキュメントも非常に優れています。開始するための記事は次のとおりです。

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

于 2009-06-23T21:46:45.510 に答える