2008-11-24 62 views
15

我正在处理对象工厂以跟踪对象的一个​​小集合。这些对象可以是不同的类型,但它们都会响应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; 
}

有没有办法将类名传递给方法,正如我上面makeObjectOfClass:(CLASSNAME)className参数所做的那样?

为了完整起见,这里是我为什么要管理所有对象的原因。我希望能够通过拨打[factory reset];来一次性重置一组完整的对象。

- (void)reset 
{ 
    [managedObjects makeObjectsPerformSelector:@selector(reset)]; 
}
+0

我之间迈克尔·蔡的和马特·加拉格尔的答案撕裂。我提高了两个,因为都提到了'Class'的用法,这正是我所期待的。最后,我选择了马特的答案,因为它强调了“类”在ClassFromString,这是第一个编辑之前提到使用“类”的。 – 2008-11-24 22:31:32

+0

@Ned Batchelder:谢谢你改变标签。出于某种原因,“的ObjectiveC”显示更多的项目(约200),比当我添加标签的问题出现标签的下拉列表“的ObjectiveC”,但我现在看到“的ObjectiveC”已经重定向以“Objective-C的” – 2008-11-24 23:08:48

+0

@eJames:你的问题显示-reset发送到实例,而不是类对象,所以我认为[ACLASS respondsToSelector:@selector(复位)]在马特加拉格尔的答案不正确。 – 2008-11-25 00:51:33

回答

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; 
} 
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]]; 
3

这是很容易动态地指定一个类,其实你可以仅仅通过它的名字引用它:其他

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

一个提示,我一会由于大多数其他Cocoa程序员将它从Core Data读取为NSManagedObject,因此无法使用命名'托管对象'。你也可能发现使用全局NSNotification(所有你可重置的对象订阅的)更容易,而不是管理一组不同类型的对象,但是你比我更知道做出这个决定。

3

答案从其他答案缺少的一点是,你可以定义一个@protocol包含您+createInstance+reset方法。

相关问题