Как ограничить класс для доступа к методам указанных протоколов в Objective-C? - PullRequest
0 голосов
/ 15 февраля 2010

Когда я пытаюсь вызвать методы protocolA для объекта protocolB, я получаю предупреждения компилятора ", но как бы ограничить его только методами protocolB, я имею в виду, что он не должен позволять мне запускать код, это должно дать мне ошибку ??? Есть ли способ решить эту проблему в Objective-C?

Пример:

// this is protocolA.h

@protocol protocolA
-(void)methodA;
@end

//this is protocolB.h
#import "protocolA"
@protocol protocolB <protocolA>
-(void)methodB;
@end

//this is MyClass.h
#import "protocolA"

@interface MyClass <protocolA>
{}
@end

//this is MyClass.m 
@implementation

-(void)applicationDidFinishLaunching
{
  id<protocolA> objA = [[MyClass alloc]init];
  [objA methodA];//Should work fine
  [objA methodB];//**Sholud give me error, but only warning is prompted but able to access methodB using objA and print its contents**
}
-(void)methodA
{
NSLog(@"This is in protocolA");
}

-(void)methodB
{
NSLog(@"This is in protocolB");
}

@end

ПРИМЕЧАНИЕ. Здесь я расширяю protocolA в protocolB, но когда я создаю объект protocolA в MyClass, я должен иметь доступ только к методу A protocolA, а не к методу B protocolB.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2010

Предупреждение компилятора самое дальнее, что вы можете получить. Вы можете включить флаг «обрабатывать предупреждения как ошибки» (-Werror).

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

0 голосов
/ 15 февраля 2010

Линия:

id<protocolA> objA;

говорит о том, что objA соответствует <protocolA>. Он не сообщает, соответствует ли objA <protocolB> или нет.

Таким образом, компилятор не знает, является ли ошибкой отправка methodB сообщения objA. Действительно, в этом случае это не ошибка.

...