Я создал протокол, который мои классы должны реализовать и затем факторизовали некоторую общую функциональность в базовый класс, таким образом, я сделал это:
@protocol MyProtocol
- (void) foo;
- (void) bar;
@end
@interface Base <MyProtocol>
@end
@interface Derived_1 : Base
@end
@interface Derived_2 : Base
@end
@implementation Base
- (void) foo{
//something foo
}
@end
@implementation Derived_1
- (void) bar{
//something bar 1
}
@end
@implementation Derived_2
- (void) bar{
//something bar 2
}
@end
Таким образом в моем коде я использую универсальный идентификатор <MyProtocol>.
Работы кода (как долго, поскольку Основа не используется непосредственно), но дроссели компилятора в конце реализации Основы с предупреждением:
Incomplete implementation of class Base
Существует ли способ избежать этого предупреждения или, еще лучше, более надлежащий способ получить это частично реализованное поведение абстрактного базового класса в Objc?
Вы могли бы сделать что-то вроде этого:
@implementation Base
- (void)bar
{
if ([self class] == [Base class]) {
[self doesNotRecognizeSelector:_cmd];
}
}
@end
Таким образом, у вас есть реализация, но по умолчанию она вызывает исключение. Однако, если производный класс случайно вызывает [super bar]
или не отменяет bar
, то исключение не будет вызвано . Если это не то, что вы хотите, вы можете просто сократить его до:
@implementation Base
- (void)bar
{
[self doesNotRecognizeSelector:_cmd];
}
@end
. В этом случае будет сгенерировано исключение, даже если подкласс вызывает [super bar]
или не отменяет bar.
.
В определении протокола вам необходимо объявить свои методы с помощью ключевого слова @optional
.
Ваш код должен выглядеть так:
@protocol MyProtocol
@optional
- (void) foo;
- (void) bar;
@end
См. Этот вопрос по SO.
В Obj-C нет понятия абстрактного класса. Таким образом, вы не можете позволить вашему базовому классу быть абстрактным (что означает не реализовывать все методы в протоколе). У вас может быть только 2 варианта. Позволить методу в протоколе быть опциональным и затем реализовать его самостоятельно в производном классе. Или заставить все классы в иерархии реализовать его, но позволить вызывающему классу быть осторожным, чтобы не вызвать неправильный метод
.