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