Estoy trabajando en una fábrica de objetos para realizar un seguimiento de una pequeña colección de objetos. Los objetos pueden ser de tipos diferentes, pero todos responderán a createInstance
y reset
. Los objetos no se pueden derivar de una clase base común porque algunos de ellos deberán derivarse de clases incorporadas de cacao como NSView
y NSWindowController
.¿Cómo puedo pasar un nombre de clase como argumento a una fábrica de objetos en cacao?
Me gustaría ser capaz de crear instancias de cualquier objeto adecuado simplemente pasando el nombre de clase deseada a mi fábrica de la siguiente manera:
myClass * variable = [factory makeObjectOfClass:myClass];
El método makeObjectOfClass:
sería algo como esto:
- (id)makeObjectOfClass:(CLASSNAME)className
{
assert([className instancesRespondToSelector:@selector(reset)]);
id newInstance = [className createInstance];
[managedObjects addObject:newInstance];
return newInstance;
}
¿Hay alguna manera de pasar un nombre de clase a un método, como he hecho con el argumento (CLASSNAME)className
al makeObjectOfClass:
anterior?
Para completar, aquí es por qué quiero administrar todos los objetos. Quiero poder restablecer el conjunto completo de objetos en una sola toma, llamando al [factory reset];
.
- (void)reset
{
[managedObjects makeObjectsPerformSelector:@selector(reset)];
}
Estoy dividido entre Michael Tsai y respuestas de Matt Gallagher. Subí ambos, ya que ambos mencionan el uso de 'Clase', que es lo que estaba buscando. Al final, elegí la respuesta de Matt porque enfatiza 'Clase' sobre ClassFromString, y fue el primero en mencionar el uso de 'Clase' antes de las ediciones. –
@Ned Batchelder: Gracias por cambiar la etiqueta. Por alguna razón, 'objectivec' muestra muchos más elementos (alrededor de 200) que 'objetivo-c' en la lista desplegable de etiquetas que aparece cuando agregué etiquetas a la pregunta, pero ahora veo que 'objectivec' ha sido redirigido a 'objetivo-c' –
@eJames: Su pregunta muestra -reset enviado a instancias, no el objeto de clase, por lo que creo que [aClass respondsToSelector: @selector (reset)] en la respuesta de Matt Gallagher es incorrecto. –