私は Objective-C の学習を始めたばかりで、 Stephen G. KochanによるProgramming in Objective-C 3rd Editionを読んでいます。
ポリモーフィズムのメカニズムを説明する段落があります。
実行時に、Objective-C ランタイム システムは、dataValue1 (id オブジェクト) 内に格納されているオブジェクトの実際のクラスをチェックし、正しいクラスから適切なメソッドを選択して実行します。ただし、より一般的なケースでは、コンパイラはメソッドに引数を渡したり、その戻り値を処理したりするための間違ったコードを生成します。これは、たとえば、一方のメソッドが引数としてオブジェクトを取り、もう一方のメソッドが浮動小数点値を取った場合に発生します。または、たとえば、一方のメソッドがオブジェクトを返し、もう一方のメソッドが整数を返した場合。2 つのメソッド間の矛盾がオブジェクトの型の違いだけである場合 (たとえば、Fraction の add: メソッドは引数として Fraction オブジェクトを取り、それを返し、Complex の add: メソッドは Complex オブジェクトを取り、返すなど)、コンパイラは次のことを行います。いずれにせよ、メモリ アドレス (つまり、ポインター) はオブジェクトへの参照として渡されるため、正しいコードが生成されます。
段落の最初の部分で、同じ名前で異なる型の引数を持つ異なるクラスで 2 つのメソッドを宣言すると、コンパイラが間違ったコードを生成する可能性があると述べていることはよくわかりません。段落の最後の部分では、同じ名前で引数と戻り値の型が異なる2つのメソッドを使用しても問題ないと述べています...ああ、いや...
次のコードがあり、コンパイルして正常に実行されます。
@implementation A
- (int) add:(int)a {
return 1 + a;
}
@end
@implementation B
- (int) add: (B*) b {
return 100;
}
@end
id a = [[A alloc] init];
id b = [[B alloc] init];
NSLog(@"A: %i, B %i", [a add:100], [b add:b]);
編集:私が引用したテキストのように、上記のコードはエラーを引き起こすはずですが、いくつかの警告メッセージしか生成しません.「add:」という名前の複数のメソッドが見つかりました. 「id」を「int」型のパラメータに送信する整数変換への互換性のないポインタ
私は Java と C++ のバックグラウンドを持っています。Objective-C のポリモーフィズムがこれらの言語のポリモーフィズムとは少し異なることは知っていますが、不確実性についてはまだ混乱しています (太字のテキスト)。
私は何かを誤解しているに違いないと思います。私とそれを必要とする人のために、Objective-C の動的バインディングについて詳しく説明していただけますか?
ありがとうございます!