3

Objective-C でメソッドを「オーバーロード」できるかどうかについては、議論/意見の相違があるようです。Objective-C でメソッドのオーバーロードを定義することは (メソッド シグネチャの構文が異なるため) C++ の用語と同じであることは別として、特に質問します。

1) これらのメソッドの両方を宣言/実装するクラス:

- (void) doSomethingWithObject:(ClassA*) object;
- (void) doSomethingWithObject:(ClassB*) object;

2) これらのメソッドの両方を宣言/実装するクラス:

- (void) doSomethingWithObject:(ClassA*) object;
- (BOOL) doSomethingWithObject:(ClassA*) object;

3) このメソッドを宣言/実装するクラス:

- (void) doSomethingWithObject:(ClassB*) object;

...そのスーパークラスがこのメソッドを宣言/実装する場合:

- (void) doSomethingWithObject:(ClassA*) object;

(および競合する戻り値の類似物)、A)ClassBが から派生した場合ClassA、および B) ない場合の両方。

4

2 に答える 2

7

質問 1: できない: Objective-C はメソッド名に型を含めません。マングリングはありません。Objective-C++ で動作する可能性がありますが、それほど使用したことはありません。

質問 2: 同じです。うまくいきません。

質問 3: 動作します。

編集: 一般に、メソッド名には型が含まれないため、型を削除してそれらが同じである場合、同じと見なされるため、同じクラスでは許可されません。同じように、異なるクラスにある場合は機能しますが、呼び出しで使用される型と呼び出されるもので使用される型が完全に一致しない場合、混乱が生じる可能性があります。

于 2012-07-07T10:42:18.967 に答える
1

入力の型に基づいてどのインスタンス メソッドを呼び出すかをコンパイラが判断する静的バインディングを行う C++ の観点から考えています。

Objective-C はそのようには機能しません。代わりに、すべてのバインドは実行時に動的です。C ++で「仮想」と宣言されているすべてのメソッドのようなものです。プログラマは、メソッドが期待する方法で応答する適切な変数を渡す責任があります。

メソッドは、渡されたオブジェクトが特定のセレクターに応答するかどうかを照会し、より堅牢な動作が必要な場合はそれに基づいて適切なアクションを実行できます。または、メソッドは、渡されるオブジェクトが期待する型であるかどうかを尋ねることができます。繰り返しますが、これはすべて実行時にメソッドで行われます。コンパイラによるものではありません。

答えは、次のように宣言します。

- (void) doSomethingWithObject:(id) object;

...次に、好きなオブジェクトを渡します。

于 2012-07-08T06:05:26.870 に答える