Что эквивалентно чисто виртуальной функции C ++ в Objective-C? - PullRequest
10 голосов
/ 07 декабря 2010

Простым ответом будет протокол.

Другой момент заключается в том, что сказано, что все методы в ObjectC являются виртуальными, поэтому нет необходимости говорить виртуальные в ObjC.

Мне трудно понять эту концепцию.

Есть ли какие-либо комментарии, чтобы выяснить этот вопрос?

Спасибо за комментарий.

Ответы [ 2 ]

13 голосов
/ 07 декабря 2010

Простым ответом будет протокол.

Просто, но неправильно. Протокол - это спецификация интерфейса. Это набор сообщений, на которые должен ответить объект (пока игнорируя ключевое слово @optional).

Термин «виртуальная функция» не имеет прямого аналога в Objective-C. В Objective-C вы не вызываете функции для объектов, вы отправляете им сообщения. Затем сам объект решает, как реагировать на сообщение, обычно, просматривая сообщение в своем объекте класса, находя связанный метод и вызывая его. Обратите внимание, что все это происходит во время выполнения, а не во время компиляции.

Отображение между сообщениями (или «селекторами», чтобы дать им технический термин) и методами построено полностью из @implementation. Объявления методов в @interface предназначены только для того, чтобы предоставить компилятору информацию, которая ему нужна, чтобы предупредить вас о том, что вы, возможно, забыли реализацию метода. И это только предупреждение, потому что до времени выполнения вы не можете сказать, действительно ли объект отвечает на сообщение или нет. Например, кто-то другой может добавить категорию к существующему классу, которая обеспечивает реализации для отсутствующих методов, или класс может переопределить forwardingTargetForSelector: для пересылки сообщений, на которые он не отвечает в другом месте.

2 голосов
/ 07 декабря 2010

Методы для объектов в Objective-C не являются виртуальными функциями, они являются реальными функциями.

Я позволю себе не согласиться, методы в Obj-C не совсем реальны, как и следовало ожидать. Они ведут себя так же, как виртуальные функции в C ++, за исключением того, что вы не можете создать «чисто виртуальную» функцию в Objective-C.

Ура, Raxit

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