Objective-C эквивалент «переопределить» в C # - PullRequest
13 голосов
/ 23 июня 2009

Предположим, у класса Vehicle есть метод с именем "StartEngine", и в моем подклассе с именем "Самолет" я хочу переопределить "StartEngine". Если я использую C #, я должен использовать ключевое слово "override" в объявлении / определении метода AirEne StartEngine.

Причина, по которой я спрашиваю, заключается в том, что если вместо «StartEngine» я введу «startengine», C # будет жаловаться, а Objective-C - благодаря этому ключевому слову.

Ответы [ 4 ]

15 голосов
/ 23 июня 2009

Все методы класса и экземпляра в Objective-C отправляются динамически и могут быть переопределены в подклассах. Нет ничего похожего на ключевое слово C # override или его ключевое слово virtual.

11 голосов
/ 23 июня 2009

Да - это определенно возможно. Там нет переопределить ключевое слово, хотя. Просто объявите функцию с идентичной сигнатурой в вашем подклассе, и она будет вызываться вместо версии суперкласса.

Вот как может выглядеть метод startEngine в самолете:

- (void)startEngine
{
    // custom code

    // call through to parent class implementation, if you want
    [super startEngine];
}
2 голосов
/ 23 июня 2009

Все методы в Objective-C являются переопределяемыми, вы просто пишете метод для той же сигнатуры.

0 голосов
/ 01 марта 2019

Во всех ответах пока отсутствует актуальная точка вопроса. Это было не «могу ли я переопределить методы», это было «могу ли я заставить компилятор сказать мне, когда то, что я считаю переопределением, на самом деле ничего не переопределяет».

К сожалению, ответ на вопрос - нет. На момент написания этой статьи у ObjC не было способа аннотировать метод как явное переопределение метода базового класса.

Из-за динамической диспетчеризации невозможно получить точный эквивалент тому, что есть в C #, C ++ и Java. Динамическая диспетчеризация означает, что практически все объекты отвечают на все сообщения, просто иногда этот ответ вызывает исключение. И то, как реагирует какое-либо конкретное сообщение, может динамически изменяться во время выполнения. Таким образом, компилятор не может сказать вам во время компиляции со 100% уверенностью, будет ли какой-либо конкретный метод иметь обработчик не по умолчанию во время выполнения.

Теперь, несмотря на это, я никогда не писал компилятор ObjC, но теоретически я думаю, что компилятор мог бы проверить метод, который вы объявляете как переопределение, против статически объявленных сигнатур методов во всех базовых классах. Именно так написано подавляющее большинство кода ObjC, с явно выраженными сигнатурами методов, статически записанными в объявлениях @interface. Таким образом, вы могли бы иметь аннотацию типа NS_INTERFACE_OVERRIDE, которая требует, чтобы некоторый базовый класс текущего класса имел ту же сигнатуру, явно объявленную в разделе @interface.

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