Как именно работает диспетчеризация «я» и «супер»? - PullRequest
0 голосов
/ 10 марта 2012

Пожалуйста, помогите мне прояснить методы экземпляра в Задаче C:

  • Может отправлять сообщения на self и super внутри
    • и отправлять сообщение вызывающемуобъект, но используйте разные реализации
    • , если ваш суперкласс вызывает метод на self, он [выполнит] вашу реализацию (если она существует)

Лекция 3, Стэнфордский университет, курс Objectve-C

1 Ответ

2 голосов
/ 10 марта 2012

Хорошо, теперь, когда на самом деле можно понять вопрос:

Допустим, у вас есть класс 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*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...