2012-02-22 13 views
7

Per le istanze di oggetti che possiamo avere la loro classe dichiarare alcuni conformità del protocollo come in:ObjC: esiste un "protocollo di classe"?

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

@interface C : NSObject <P> 
@end 

@implementation C 
- (void) someMethod { 

} 
@end 

Ma per quanto riguarda le classi?

mi ritrovo in questa situazione:

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

e mi piacerebbe che ci fosse un modo per me di dichiarare che esiste una cosa come protocolli per metodi di classe.

Nell'esempio di cui sopra, tutte le classi che C può essere una classe istanza (Hmmm ??) di, dichiarare

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

C'è un modo che io possa trasformare la sopra in:

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

utilizzando un'adeguata dichiarazione "class protocol"?

risposta

7

Ci sono cose come Protocolli per metodi di classe, e si chiamano .... protocolli. Per esempio, sembra che si desidera un protocollo che assomiglia a questo:

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

è possibile utilizzare in questo modo:

Class c = [self modelClass:kind]; 
if ([c conformsToProtocol:@protocol(MyDecoder)]) { 
    model = [c decode: [SExpIO read: [fm contentsAtPath:target]]]; 
} 
+0

Eccellente! Grazie – verec

9

Un protocollo è solo un elenco di dichiarazioni di metodo. Possono essere metodi di classe o metodi di istanza. Esempio:

@protocol MyProtocol 

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

@end 
+0

Non sapevo si potesse fare ... pulito. – Steve

+0

Wow! Non me lo aspettavo! Grazie!! Ho provato e anche compilato, ma sono perplesso: dato che Class c = [self modelClass: kind]; è davvero un modo indiretto di dire Classe c = NSClassFromString (@ "SomeClassThatIndeedImplementsModel"); come mai questo compila affatto: if (c) { model = [c decode: [SExpIO read: [fm contentsAtPath: target]]]; } "Classe" di per sé non ha informazioni di tipo, a quanto pare? – verec

+0

Le classi sono oggetti in Objective-C. Le classi hanno meta-classi, che sono anche oggetti: 'typedef struct objc_class * Class; typedef struct objc_object { Classe isa; } * id; ' –

Problemi correlati