有趣的Objective-c方法行为

时间:2012-01-05 22:48:53

标签: objective-c inheritance methods polymorphism override

为什么来自_something的{​​{1}}来电呼叫B实施foo

_something

4 个答案:

答案 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