2009-07-09 16 views
10

私は現時点でObjective-Cを学んでおり、プロトコルのオプションのメソッドを見つけました。私の背景はC#で、プロトコルはC#インターフェイスと似たものです。現実世界の@optionalプロトコルメソッドの例

ここで、C#インターフェイスは契約を表し、インターフェイスを宣伝することによって、定義されたメソッドを実装すると言います。

これを念頭に置いて、なぜオプションのメソッドを定義する必要があるのか​​混乱します。これは、Objective-Cを減らすためのスラッシュや試みではなく、Objective-Cが大好きです。言語の理解を深めるために、これらのオプションのメリットを理解したいだけです。

誰かがオプションのメソッドが役に立つ実際のシナリオ(サンプルコード付き)を提供できるのであれば、本当にありがたいです。

答えて

14

例を挙げます。私は、Flickr APIと会話する多くのObjCクラスを持っています。 FKAccountと呼ばれるものの1つは、ユーザーの写真のダウンロード、連絡先リストの取得など、Flickrユーザーのアカウントに関連する多くのことができます。

FKAccountクラスは、代理プロトコルFKAccountDelegateを定義します。このプロトコルは、FKAccountがそのデリゲートで呼び出すいくつかのコールバックメソッドを、Flickrに対するさまざまなネットワーク操作の成功または失敗に応じて指定します。 FKAccountを使用するすべてのアプリケーションが、FKAccountが実行できるすべてのFlickr操作に興味を持つわけではありません。それは、すべてのクラスがFKAccountDelegateプロトコルはすべてのメソッドを実装実装すると主張することを求められた場合は

、あなたはスタブメソッドの多くで終わるだろう(FWIW、FKAccountDelegateで定義されている41個の方法があります)。これらのメソッドがプロトコルで@optionalと宣言されている場合、デリゲートは受信するコールバックのみを実装する必要があります。

そのデリゲートがして、プロトコルで@optionalメソッドに応答FKAccountクラスチェック:私は今それを取得していると思う

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

。 C#インタフェースは、Objective-Cプロトコルの1つの側面にすぎません。プロトコルは契約として使用できますが、これらのオプションのメソッドは、オブジェクトが応答することもできるオプションのデリゲートのリストを構成します。それは本当に面白いです。 – kim3er

+1

デリゲート機能を文書化するプロトコルを使用する場合は+1 –

+1

@Tomと全く同意します。 Objective-C 2.0以前は、デリゲートメソッドを実装する必要があるクラスを避けるため、NSObjectのカテゴリでデリゲートメソッドが宣言されていました。プロトコル内のオプションのメソッドは、NSObjectにたくさんのメソッドを付けることなく、メソッドの衝突を回避するのに役立つ、よりクリーンなソリューションです。 Javaだけがオプションのインターフェースメソッドを持っていれば、MouseAdapterから継承するようなものは必要ありません。そのようなクラスを使用することは、通常、私が単一継承を呪ったことは数回です:-) –

関連する問題