Подтвердить что ты не робот

Внедрение чистого виртуального метода в Objective-C

Я хочу пойти туда. Серьезно, однако, как реализовать реалистичный виртуальный метод в "Apple"? Используете ли вы протокол с базовым классом и исключаете исключения из этих методов?

4b9b3361

Ответ 1

Когда вы программируете в Objective-C, вам нужно очистить свой разум от таких вещей, как виртуальные методы. Вы не вызываете методы в объектах Objective-C, вы отправляете им сообщения. Объекты либо отвечают на сообщения, либо нет, но из-за динамического связывания вы не можете сказать это до времени выполнения.

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

Лучший способ создания "виртуальных" базовых классов (на мой взгляд) состоит в том, чтобы объявить метод и дать ему реализацию заглушки, которая создает подходящее исключение.

Ответ 2

В Objective-C нет чистой виртуальной поддержки, как в С++.

Симуляция будет заключаться в том, что вы объявляете метод в своем интерфейсе, но не реализуете его в своем .m файле. Конечно, вы получите предупреждения о компиляторе, но IIRC вы можете отключить их. Но вы не получите предупреждений/ошибок, если вы не перезапишите их в подклассе, который вы получаете на С++ (IIRC).

Альтернативой было бы реализовать их только с тегом NSAssert(NO, @"Subclasses need to overwrite this method");. Тем не менее, вы поймаете это только во время выполнения, а не в compiletime.

Ответ 3

В зависимости от того, что вы делаете, шаблон делегата может быть более подходящим, чем подкласс, где делегат определяется как id<YourDelegateProtocol>. Компилятор будет генерировать предупреждение, если необходимые методы в протоколе делегата не реализованы.

Подкласс обычно избегается в Objective-C, поскольку объекты не могут наследовать от нескольких суперклассов, но они могут реализовывать несколько протоколов.

Ответ 5

У вас есть несколько вариантов, но вы на правильном пути.

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

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

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

Но ObjC не хватает некоторых функций lang, которые позволяют клиентам застрелиться в ноге, или обходиться с ними так, как вам хочется... вы не должны слишком зацикливаться на ее соблюдении.

Примечание. Исключения очень необычные (и немного небезопасные) тоже в ObjC.

Ответ 6

Виртуальный метод - это метод, поведение которого можно переопределить внутри наследующего класса функцией с той же сигнатурой (то же имя с таким же числом параметров и типом параметров).

Пример: -

@implementation BaseClass

-(void)viewDidLoad
{
 [self virtualMethod:123];
}

-(void)virtualMethod:(int)param
{
 //implement this method in subclass
}

@end

////////////////////////////////////////////////////

@interface ChildClass:BaseClass
@end

@implementation ChildClass

-(void)virtualMethod:(int)param
{
 NSLog(@"There is no keyword "Virtual" in Objective C.");
}
@end

Выход: -

"В Objective C нет ключевого слова" Виртуальный ".