Как избежать “неполной реализации” предупреждение в частичном базовом классе

Я создал протокол, который мои классы должны реализовать и затем факторизовали некоторую общую функциональность в базовый класс, таким образом, я сделал это:

@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?

14
задан garph0 18 May 2010 в 04:13
поделиться

3 ответа

Вы могли бы сделать что-то вроде этого:

@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. .

12
ответ дан 1 December 2019 в 12:38
поделиться

В определении протокола вам необходимо объявить свои методы с помощью ключевого слова @optional .

Ваш код должен выглядеть так:

@protocol MyProtocol

@optional
- (void) foo;
- (void) bar;

@end

См. Этот вопрос по SO.

9
ответ дан 1 December 2019 в 12:38
поделиться

В Obj-C нет понятия абстрактного класса. Таким образом, вы не можете позволить вашему базовому классу быть абстрактным (что означает не реализовывать все методы в протоколе). У вас может быть только 2 варианта. Позволить методу в протоколе быть опциональным и затем реализовать его самостоятельно в производном классе. Или заставить все классы в иерархии реализовать его, но позволить вызывающему классу быть осторожным, чтобы не вызвать неправильный метод

.
1
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: