ObjC: существует ли такая вещь, как «протокол класса»? - PullRequest
7 голосов
/ 22 февраля 2012

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

@protocol P <NSObject>
- (void) someMethod ;
@end

@interface C : NSObject <P>
@end

@implementation C
- (void) someMethod {

}
@end

А как насчет классов?

Я нахожусь в такой ситуации:

...
Class c = [self modelClass:kind] ;
if (c) {
    model = [c performSelector: @selector(decode:) 
                    withObject: [SExpIO read: [fm contentsAtPath:target]]] ;
}

и я хотел бы, чтобы у меня был способ объявить о существовании такой вещи, как протоколы для методов классов.

В приведенном выше примере все классы, которые могут быть классом экземпляра (Хммм)??) из, объявлять

+ (id) decode: (SExp *) root ;

Есть ли способ, которым я мог бы преобразовать вышеупомянутое в:

if (c) {
    model = [c decode: [SExpIO read: [fm contentsAtPath:target]]]
}

, используя подходящее объявление "протокола класса"?

Ответы [ 2 ]

9 голосов
/ 22 февраля 2012

Протокол - это просто список объявлений методов. Это могут быть методы класса или методы экземпляра. Пример:

@protocol MyProtocol

+ (id) aClassMethod;
+ (void) someOtherClassMethod;
- (void) someInstanceMethod;

@end
7 голосов
/ 22 февраля 2012

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

@protocol MyDecoder
+ (id)decode:(SExp *)root;
@end

Затем вы можете использовать его так:

Class c = [self modelClass:kind];
if ([c conformsToProtocol:@protocol(MyDecoder)]) {
     model = [c decode: [SExpIO read: [fm contentsAtPath:target]]];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...