2

私は、Javaから知られている方法で変数を宣言することがObjective-Cで可能かどうかについて興味があります。

Class<?extends SomeType>

例:MyClassというクラスがあります。静的メソッドがあります

+ (void)myMethod

また、MySubclassAとMySubclassBの2つのサブクラスがあります。私はそのようなコードを持っています:

Class myClass;
if(<some condition>) {
  myClass = [MySubclassA class];
} else {
  myClass = [MySubclassB class];
}
[myClass myMethod];

このコードは正常に機能し、コンパイラの警告はありませんが、私が言及した構造がObjective-Cに何らかの形で存在するかどうかだけが気になります。

ありがとう!

4

1 に答える 1

1

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

于 2011-03-23T13:21:49.510 に答える