如何将类名作为参数传递给cocoa中的对象工厂?

时间:2008-11-24 21:38:55

标签: objective-c cocoa constructor factory

我正在处理一个对象工厂,以跟踪一小部分对象。对象可以是不同类型的,但它们都会响应createInstancereset。这些对象不能从公共基类派生,因为其中一些必须派生自内置的可可类,如NSViewNSWindowController

我希望能够通过简单地将所需的类名传递给我的工厂来创建任何合适对象的实例,如下所示:

myClass * variable = [factory makeObjectOfClass:myClass];

makeObjectOfClass:方法看起来像这样:

- (id)makeObjectOfClass:(CLASSNAME)className
{
    assert([className instancesRespondToSelector:@selector(reset)]);
    id newInstance = [className createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

有没有办法将类名传递给方法,就像上面(CLASSNAME)className的{​​{1}}参数一样?

为了完整起见,这就是我想管理所有对象的原因。我希望能够通过调用makeObjectOfClass:一次性重置完整的对象集。

[factory reset];

5 个答案:

答案 0 :(得分:22)

您可以使用以下函数将字符串转换为类:NSClassFromString

Class classFromString = NSClassFromString(@"MyClass");

在你的情况下,你最好直接使用Class对象。

MyClass * variable = [factory makeObjectOfClass:[MyClass class]];

- (id)makeObjectOfClass:(Class)aClass
{
    assert([aClass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [aClass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

答案 1 :(得分:5)

答案 2 :(得分:3)

动态指定一个类非常容易,实际上你可以通过它的名称来引用它:

id string = [[NSClassFromString(@"NSString") alloc] initWithString:@"Hello!"];
NSLog( @"%@", string );

另外一个提示,我会避免使用命名法'托管对象',因为大多数其他Cocoa程序员都会从Core Data中读取NSManagedObject。您可能还会发现使用全局NSNotification(所有可重置对象都订阅)更容易,而不是管理不同类型对象的集合,但是您比我更了解做出决定。

答案 3 :(得分:3)

其他答案中遗漏的答案是您可以定义包含@protocol+createInstance方法的+reset

答案 4 :(得分:2)

听起来你想要这样的东西:

- (id)makeObjectOfClassNamed:(NSString *)className
{
    Class klass = NSClassFromString(className);
    assert([klass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [klass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

这将假设一个名为+createInstance的类方法。或者您可以使用[[klass alloc] init]

要打电话:

MyClass *variable = [factory makeObjectOfClassNamed:@"MyClass"];

根据你要做的事情,传递类对象而不是字符串可能更好,例如:

MyClass *variable = [factory makeObjectOfClass:[MyClass class]];