2009-06-18 6 views
22

これらは基本的に同じですか?私はJavaでのインターフェースを持っている場合Objective-C。 Javaインターフェイスのようなプロトコルを使用できますか?

は、例えば、私は、パラメータとしてCoolObjectを取る関数でCoolObjectインタフェースを実装する任意のオブジェクトを使用することができます

public interface CoolObject{ 
... 
} 

public void foo(CoolObject o) { 
... 
} 

はです。このObjective-Cでも同じですか?

@protocol CoolProtocol 
... 
@end 

@interface Foo: NSObject <CoolProtocol> 
... 
@end 

(void) - someMethod: (CoolProtocol *) obj { 
} 

う上記の仕事(と正しいと見なされる?)お時間を

感謝。私の質問を明確にするために私が必要かどうかを教えてください。

答えて

34

閉じる。すべての場合において

- (void) someMethod: (id <CoolProtocol>) obj { } 
- (void) someMethod: (id <NSObject, CoolProtocol>) obj { } 
- (void) someMethod: (NSObject <CoolProtocol> *) obj { } 

、あなたはのsomeMethodは、その実装するオブジェクトが必要であることを言っている:Objective Cのでは、あなたがこれらのいずれかのようなあなたの方法を記述しますので、>オブジェクトは角括弧<とプロトコルを実装していることを示しますCoolProtocol。

idは、あらゆる種類のObjective Cオブジェクトへの汎用ポインターです。

So id < CoolProtocol>は、「CoolProtocolを実装するあらゆる種類の目的のCオブジェクト」を意味します。

多くの場合、オブジェクトを保持/解放/自動解除できるようにしたいが、通常は通常のCocoaオブジェクトのように扱うことが多いため、NSObjectプロトコルも追加することがよくあります。

実際に適切なCocoaオブジェクト(NSProxyベースのオブジェクトを除く)であることを確認したい場合、最後のフォームを使用することができます。基本的には「CoolProtocolを実装する実際のCocoa Objective Cオブジェクト。

+2

良い答えになります。関連するアプローチは、CoolProtocolにid をうまく動作させるNSObjectプロトコルを採用させることです。 NSObjectのサブクラス化に失敗したオブジェクトがコンパイル時にエラーを引き起こし、Objective-Cを強力で柔軟にするダイナミックスを減らす静的型付けを呼び出すので、最後の形式は正しいですが、通常はあまりにも冗長です。 –

14

ピーターズの答えは素晴らしいです。私は1つのことを追加したいと思います。あなたのプロトコル

@protocol CoolProtocol <NSObject> 
@end 

に「NSObjectの」プロトコルを追加した場合これは、メソッドの宣言でNSObjectのプロトコルを宣言するために必要性を軽減するでしょう。

- (void) someMethod: (id <NSObject, CoolProtocol>) obj { } 

は今

- (void) someMethod: (id <CoolProtocol>) obj { } 
関連する問題