我刚刚开始学习 Objective-C,我正在阅读Stephen G. Kochan的Programming in Objective-C 3rd Edition。
有一段解释多态机制:
在运行时,Objective-C 运行时系统将检查存储在dataValue1(一个 id 对象)中的对象的实际类,并从正确的类中选择适当的方法来执行。但是,在更一般的情况下,编译器可能生成不正确的代码以将参数传递给方法或处理其返回值。例如,如果一个方法将对象作为其参数,而另一个方法采用浮点值,则会发生这种情况。或者,例如,如果一种方法返回一个对象,而另一种方法返回一个整数。如果两个方法之间的不一致只是对象类型不同(例如,Fraction 的 add: 方法将 Fraction 对象作为其参数并返回一个,而 Complex 的 add: 方法采用并返回一个 Complex 对象),编译器将仍然生成正确的代码,因为内存地址(即指针)无论如何都是作为对对象的引用传递的。
我不太明白该段的第一部分说如果我在具有相同名称和不同类型参数的不同类中声明 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 中的动态绑定吗?
谢谢!