Хорошо, теперь, когда на самом деле можно понять вопрос:
Допустим, у вас есть класс Foo
с методами doSomething
и doSomethingElse
, и вы создаете подкласс 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];
}
Что произойдет, если вы позвоните doSomethingElse
на Foo *aFoo
а Bar *aBar
?Результат [aFoo doSomethingElse]
очевиден: он делает [self doSomething]
, где self
- это Foo
, поэтому реализация Foo
*1046* будет выполнена.
Но когда вы сделаете [aBar doSomethingElse]
- это то, где вещи становятся интересными, и это то, к чему стремится Пол.поскольку Bar
не переопределяет doSomethingElse
, будет вызвана реализация Foo
, что, в свою очередь, [self doSomething]
.Но на этот раз self
является экземпляром Bar
, и поэтому будет вызвана реализация doSomething Bar
.
Почему бы [self doSomething]
в реализации Foo
в конечном итоге выполнитькод из подкласса Bar
?Это связано с тем, как сообщения отправляются в Objective-C.[self doSomething]
отправляет сообщение doSomething
объекту self
, и любой объект self
должен решить, какой код будет выполнен.Поскольку self
, в этой ситуации, будет Bar
, Bar
будет реализована реализация *1069*.