2011-08-03 7 views
20

En Objective-C, es posible pasar una clase como un parámetro a un método:Declarar un parámetro ObjC que una clase conforme a un protocolo de

- (void) methodThatTakesClass:(Class)theClass; 

Y es posible pasar una instancia que es conforme a un protocolo como parámetro:

- (void) myConformInstance:(id <MyProtocol>)theObject; 

¿Es posible utilizar la funcionalidad combinada? Un método que toma una clase que se ajusta a un cierto protocolo.

Respuesta

12

Sí. El siguiente es un programa válido que registrará la clase NSObject.

#import <Foundation/Foundation.h> 
void f(Class <NSObject> c) { 
    NSLog(@"%@",c); 
} 
int main() { 
    f([NSObject class]); 
} 

Esto provocaría un error de compilación si se trató de pasar una clase que no sea conforme a NSObject, tales como la clase Object. También puedes usarlo para métodos.

- (void)printClass:(Class <NSObject>)c; 
+2

Desde [Protocolos] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html) : "Los protocolos no se pueden usar para escribir objetos de clase. Solo las instancias pueden escribirse estáticamente en un protocolo, del mismo modo que solo las instancias pueden escribirse estáticamente en una clase. (Sin embargo, en el tiempo de ejecución, ambas clases e instancias responden a conformsToProtocol: mensaje). " – albertamg

+0

@albertamg Buen descubrimiento. Sin embargo, al menos algunos compiladores lo dejan pasar. La regla podría deberse a que no puede cambiar el objeto que representa la clase para que se ajuste a un protocolo. – ughoavgfhw

-2

también válida:

@interface Something: Object { 
} 
- (void) foo:(int(*)(void))bar; 
@end 

@implementation Something 
- (void) foo:(int(*)(void))bar { 
    return (*bar)(); 
} 
@end 

int someFunc(void) { 
    return 9; 
} 

int main (int argc, char **argv) { 
    Something *object = [[Something alloc] init]; 

    printf("%i\n", [object foo:&someFunc]); 

    [object release]; 

    return 0; 
} 
+0

Esta parece ser la respuesta a una pregunta completamente diferente. –

Cuestiones relacionadas