从基类到所有子类遍历一个类层次结构

3
在我正在编写的iOS应用程序中,我希望遍历一个类层次结构以列出所有子类。我的意图是使用每个子类类型作为字典中的键 - 通过NSStringForClass()
我的动机是能够自动发现基类的所有变体,以便我可以调用与该类相关联的方法。由于分工原因,我不想在这里使用方法覆盖。
是否可能进行此类遍历?它将如何工作?

您可能会发现这个问题及其答案有用:https://dev59.com/pUrSa4cB1Zd3GeqPXIu1 - Randolpho
1
这对我来说似乎是糟糕的设计。如果您需要根据某些条件实例化不同的类,则最好使用工厂模式。 - JeremyP
@JeremyP 不一定;如果您有某种设置,想要使用工厂实例化程序注册子类,自动发现子类可以真正简化手动注册每个子类的样板文件。 - Dave DeLong
@JeremyP。也许我没有表达清楚,我这里不是实例化子类。相反,我正在发现系统中的子类集合,以便我可以关联每个子类独特的操作。通常,这将通过方法覆盖或协议符合自动完成,基于每个类的基础。在我的情况下,这将强制类具有“特征嫉妒”,而我不想要这种情况。我所追求的方法是使用类类型字典来识别和指导我需要执行的功能。 - dugla
1个回答

7

以下是一个示例。该方法将返回从您发送消息的类下降的所有子类。

@interface NSObject (Debugging)

+ (NSArray *) allSubclasses;

@end

@implementation NSObject (Debugging)

+ (NSArray *) allSubclasses
{
    Class myClass = [self class];
    NSMutableArray *mySubclasses = [NSMutableArray array];

    unsigned int numOfClasses;
    Class *classes = objc_copyClassList(&numOfClasses);
    for (unsigned int ci = 0; ci < numOfClasses; ci++) {
        // Replace the code in this loop to limit the result to immediate subclasses:
        // Class superClass = class_getSuperclass(classes[ci]);
        // if (superClass == myClass)
        //  [mySubclasses addObject: classes[ci]];
        Class superClass = classes[ci];
        do {
            superClass = class_getSuperclass(superClass);
        } while (superClass && superClass != myClass);

        if (superClass)
            [mySubclasses addObject: classes[ci]];
    }
    free(classes);

    return mySubclasses;
}

@end

根据需要进行修改,进行递归调用等操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接