请帮助我弄清楚目标C:中的实例方法
- 可以在内部向
self
和super
发送消息- 两者都将消息分派给调用对象,但使用不同的实现
- 如果您的超类调用
self
上的方法,它将[执行]您的实现(如果存在)
第3讲,斯坦福大学,Objectve-C课程
好了,现在实际上可以理解这个问题了:
假设您有一个具有方法doSomething
和doSomethingElse
的类Foo
,并且您创建了Foo
的一个子类Bar
。
在Bar
的实现中,如果您想调用doSomething
,您可以执行[self doSomething]
或[super doSomething]
。
[super doSomething]
将使用doSomething
的超类实现——特别是Foo
的实现[self doSomething]
将使用类本身对doSomething
的实现——也就是Bar
的实现。注意,如果Bar
实际上没有覆盖doSomething
,那么[self doSomething]
最终将调用超类的实现
至于如果一个超类在self
上调用一个方法会发生什么,假设Bar
覆盖doSomething
,但不覆盖doSomethingElse
,并且假设doSomethingElse
看起来像这样:
- (void)doSomethingElse
{
[self doSomething];
}
如果您在Foo *aFoo
和Bar *aBar
上调用doSomethingElse
会发生什么?[aFoo doSomethingElse]
的结果很清楚:它执行[self doSomething]
,其中self
是Foo
,因此将执行Foo
对doSomething
的实现。
但当你执行[aBar doSomethingElse]
时,事情会变得有趣,这也是Paul的目的。由于Bar
不会覆盖doSomethingElse
,Foo
的实现将被调用,而[self doSomething]
也会被调用。但这一次,self
是Bar
的一个实例,因此将调用Bar
的doSomething实现。
为什么Foo
的实现中的[self doSomething]
最终会执行来自子类Bar
的代码?这是因为消息在Objective-C中是如何调度的。[self doSomething]
向对象self
发送消息doSomething
,并且由self
是什么对象来决定执行什么代码。由于在这种情况下,self
将是Bar
,因此执行Bar
对doSomething
的实现。