如何调度“自我”和“超级”工作?

时间:2012-03-10 10:39:58

标签: objective-c

请帮助我明确目标C中的实例方法:

  • 可以向内部的selfsuper发送消息
    • 将消息分派给调用对象,但使用不同的实现
    • 如果您的超类在self上调用方法,它将[执行]您的实现(如果存在)

Lecture 3, Stanford University, Objectve-C course

1 个答案:

答案 0 :(得分:2)

好的,现在实际上可以理解这个问题:

假设您使用方法FoodoSomething创建了一个班级doSomethingElse,并创建了一个名为Foo的{​​{1}}子类。

Bar的实施中,如果您想致电Bar,可以doSomething[self doSomething]

  • [super doSomething]将使用超类的[super doSomething]实现 - 特别是doSomething的实现。
  • Foo会使用类本身的[self doSomething]实现 - 即doSomething的实现。请注意,如果Bar实际上没有覆盖Bar,那么doSomething将最终调用超类的实现。

至于如果超类在[self doSomething]上调用方法会发生什么,让我们说self会覆盖Bar,但不会覆盖doSomething,让我们说{{} 1}}看起来像这样:

doSomethingElse

如果您在doSomethingElse- (void)doSomethingElse { [self doSomething]; } 上致电doSomethingElse会怎样? Foo *aFoo的结果很明确:它Bar *aBar [aFoo doSomethingElse][self doSomething],因此self的{​​{1}}执行方式将被执行

但是当你做Foo时,事情会变得有趣,而且正是保罗所得到的。由于Foo未覆盖doSomething,因此将调用[aBar doSomethingElse]的实现,而Bar将执行doSomethingElse。但是这一次,Foo[self doSomething]的一个实例,因此将调用self的doSomething实现。

为什么在Bar的实现中Bar最终会从子类[self doSomething]执行代码?这是因为在Objective-C中如何分派消息。 Foo将消息Bar发送到对象[self doSomething],由doSomething对象来决定执行哪些代码。由于self,在这种情况下,selfself的{​​{1}}执行将被执行。