为什么来自_something
的{{1}}来电呼叫B实施foo
?
_something
答案 0 :(得分:2)
如果为B
类的对象调用它,它只调用B
的实现。
这是因为在Objective-C中,所有方法都是“虚拟的”(尽管这是一个相当大的简化),主要是由于它的dynamic dispatch。
更正确的是,Objective-C没有方法。而是将“消息”发送给对象。它在运行时处理,对象本身决定如何“响应”此消息。默认情况下,它在其类中查找选择器并调用关联的“方法”(对于A和B,_something
的情况不同)。
答案 1 :(得分:2)
如果在B的实例上调用-foo,它会这样做,因为B会覆盖-_something方法。
方法调度是通过消息发送在Objective-C中实现的,因此foo方法向接收方发送一条消息,告诉它做_something。接收器(或代表接收器的运行时)查找响应任何消息应该做的事情;消息指定方法 selector ,对象执行相应的实现。对于A类和B类,有一种不同的_something实现。
答案 2 :(得分:1)
如果对象是B
,则您调用了_something
,因此您获得了B
的{{1}}代码。如果您期望_something
的实现,那么您就会误解Objective-C消息传递。该方法的代码在运行时确定。如果你来自C ++,想象所有的方法都是虚拟的。
答案 3 :(得分:1)
如果您在课程_something
的某个对象上调用了B
,那么您基本上会覆盖它:
B *myClass = [B alloc] init];
[myClass _something];
<强>输出:强>
B
如果您完成了以下示例,则不会覆盖_something
并获得类A
的输出:
A *myClass = [A alloc] init];
[myClass _something];
<强>输出:强>
A
由于消息的动态特性,它实际上取决于您实例化对象的类:
A *myClass = [B alloc] init];
[myClass _something];
<强>输出:强>
B