2012-02-22 11 views
7

Para instancias de objetos que podemos tener su clase declarar algún protocolo que en conformidad:ObjC: ¿existe tal cosa como un "protocolo de clase"?

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

@interface C : NSObject <P> 
@end 

@implementation C 
- (void) someMethod { 

} 
@end 

Pero ¿qué pasa con las clases?

me encuentro en esta situación:

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

y me gustaría que hubiera una manera para mí declarar que hay una cosa tal como los protocolos para los métodos de clase.

En el ejemplo anterior, todas las clases que C puede ser una clase de instancia (Hmmm ??) de, declarar

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

¿Hay alguna manera de que podía transformar lo anterior en:

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

utilizando una declaración adecuada de "protocolo de clase"?

Respuesta

7

Hay son cosas tales como los protocolos para los métodos de clase, y son llamados .... Protocolos. Por ejemplo, parece que desea un protocolo que tiene este aspecto:

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

A continuación, puede utilizar de esta manera:

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

¡Excelente! Gracias – verec

9

Un protocolo es solo una lista de declaraciones de métodos. Pueden ser métodos de clase o métodos de instancia. Ejemplo:

@protocol MyProtocol 

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

@end 
+0

No sabía que se podía hacer eso ... limpio. – Steve

+0

¡Guau! ¡No esperaba eso! ¡¡Gracias!! Intenté e incluso compila, pero estoy perplejo: dado que Clase c = [self modelClass: kind]; realmente es una forma indirecta de decir Clase c = NSClassFromString (@ "SomeClassThatIndeedImplementsModel"); cómo es que esto se compila en absoluto: if (c) { model = [c decodificar: [SExpIO lectura: [fm contentsAtPath: target]]]; } "Clase" por sí solo no tiene ningún tipo de información, parece? – verec

+0

Las clases son objetos en Objective-C. Las clases tienen metaclases, que también son objetos: 'typedef struct objc_class * Class; typedef struct objc_object { Clase isa; } * id; ' –

Cuestiones relacionadas