【发布时间】:2011-10-27 23:22:16
【问题描述】:
在 Objective-C 中有一种方法可以询问一个类是否有任何子类实现。
我有一个基类,它有多个子类。我想遍历所有子类并在每个子类上执行一个类选择器。
编辑:
我有一组可以处理某些类型数据的类。每个处理器都是一个基类的子类,该基类提供每个处理器所需的方法。
每个类都知道它可以处理哪些数据,并且某些类可以比其他类更好地处理某些类型的数据。
我希望在每个类上都有一个类方法,它可以向工厂类提供响应,说是的,我可以处理该数据,并指出它可以处理它的能力。
然后,工厂将根据哪个类说它可以最好地处理数据来决定要实例化哪个类。
我也从 2009 年发现了这个问题(我在发布此问题之前进行了搜索,但没有找到任何东西)Discover subclasses of a given class in Obj-C。
编辑 2:
+ (void)load 方法看起来是我正在寻找的完美解决方案。所以我现在有以下内容:
+ (void)registerSubclass:(Class)subclass {
NSLog(@"Registered %@", subclass);
}
在我的基类中,这是我的潜艇。
+(void)load {
[BaseSwitch registerSubclass:[self class]];
}
现在显示每个子类的调试消息。
我的下一个问题是(可能是一个愚蠢的问题),我如何存储在 registerSubclass 方法中注册的类。有没有办法让我以后可以读取类变量?
编辑 3:
在这里找到一些示例代码A simple, extensible HTTP server in Cocoa
这给我留下了以下内容,毕竟说了又做了,似乎很简单。但我想我会把它放在这里以备将来参考。
@implementation BaseSwitch
static NSMutableArray *registeredSubclasses;
+ (void)registerSubclass:(Class)subclass {
if (registeredSubclasses == nil) {
registeredSubclasses = [[NSMutableArray alloc] init];
}
[registeredSubclasses addObject:subclass];
NSLog(@"Registered %@", subclass);
}
+ (void)logSubclasses {
for (int i = 0; i < [registeredSubclasses count]; i++) {
NSLog(@"%@", [registeredSubclasses objectAtIndex:i]);
}
}
@end
感谢大家的建议,如果有其他问题,我会再多几天不回答这个问题。
【问题讨论】:
-
为什么你不能在你链接的那个问题中使用 Mike 的建议?让你的超类公开一个 API 来为数据类型注册(子)类,并让每个子类使用该 API 来告诉超类它可以处理哪些数据类型。这也可以由不同的类而不是超类导出。
-
@Bavarious,这可能是我要走的路。但我有兴趣看看是否还有其他方法。
-
您最好以某种方式注册课程。动态发现很有吸引力,但 Objective-C 确实不是为这种模式设计的。显式注册还具有您可以搜索一个点或一个简单字符串以生成所有注册人清单的优势。
-
在这种情况下,您会从使用观察者设计模式中受益。您是否探索过以这种方式编码您的项目?
标签: objective-c