Objective-C には、テンプレート (C++ など)、型消去を伴うジェネリック型 (Java など)、またはランタイム ジェネリック型 (C# など) がありません。これらの言語とは異なり、Objective-C メッセージは (コンパイル時にバインドされるのではなく) 実行時に動的にディスパッチされます。したがって、C++、Java、または C# で型に依存しないコードを生成するためのシステムの多くは不要です。Objective-C は「ダックタイピング」を好みます。これにより、受信オブジェクトのタイプに関係なく、コードを呼び出すことで、特定のセレクター (メッセージ) に応答するオブジェクトにそのメッセージを与えることができます。クラスは Objective-C のオブジェクトであるため、インスタンス メソッドと同じことがクラス メソッドにも当てはまります。
だから、与えられた
@interface MyClassA : NSObject
{}
- (void)someMethod;
@end
@interface MyClassB: NSObject
{}
- (void)someMethod;
@end
呼び出しコードは次のようになります
- (void)someOtherMethodInAnOtherClassWithObject:(id)obj
{
[obj someMethod];
}
がまたはのいずれかのインスタンスであるobjと仮定すると、このコードはコンパイルされ、実行時に正常に動作します。MyClassAMyClassB
もちろん、@protocolこの状況では a を定義することをお勧めします。
@protocol MyProtocol
- (void)myMethod
@end
MyClassAあなたとMyClassB両方がMyProtocolプロトコルを実装することを宣言します。呼び出しコードは次のようになります
- (void)someOtherMethodInAnOtherClassWithObject:(id<MyProtocol>)obj
{
[obj someMethod];
}
someOtherMethodInAnOtherClassWithObject:また、インターフェイスを実装していない型のオブジェクトを渡してを呼び出そうとすると、コンパイラは (-W フラグに応じて) 警告/エラーを返しMyProtocolます。
ジェネリック型でid<MyProtocol>はなく、プロトコルidを実装すると主張している型のインスタンスであることに注意してください。MyProtocolまた、クライアント コードの最初のバージョンは問題なく動作することに注意してobjください-myMethod。