有没有办法在运行时发现给定类存在哪些子类?
编辑:从目前的答案来看,我认为我需要进一步澄清我正在尝试做的事情。我知道这在 Cocoa 中不是一种常见的做法,并且可能会有一些警告。
我正在使用动态创建模式编写解析器。 (参见 Buck 和 Yacktman 合着的 Cocoa Design Patterns 一书,第 5 章。)基本上,解析器实例处理堆栈,并实例化知道如何执行特定计算的对象。
如果我可以获得 MYCommand
类的所有子类,例如,我可以为用户提供可用命令的列表。此外,在第 5 章的示例中,解析器有一个替换字典,因此可以使用 +、-、* 和/等运算符。 (它们映射到 MYAddCommand
等)对我来说,这些信息似乎属于 MyCommand
子类,而不是解析器实例,因为它有点违背动态创建的想法。
最佳答案
不直接,不。但是,您可以获得在运行时注册的所有类的列表,并查询这些类的直接 父类(super class)。请记住,这不允许您找到类在继承树上的所有祖先,只能找到直接父类(super class)。
您可以使用 objc_getClassList()
获取在运行时注册的 Class
对象的列表。然后,您可以遍历该数组并在那些 Class
对象上调用 [NSObject superclass]
以获取其父类(super class)的 Class
对象。如果由于某种原因你的类不使用 NSObject
作为它们的根类,你可以使用 class_getSuperclass()
相反。
我还应该提到,如果您认为有必要进行这种发现,您可能对应用程序设计的思考不正确。很可能还有另一种更传统的方法来完成您要完成的任务,它不涉及对 Objective-C 运行时的自省(introspection)。
关于objective-c - 在 Obj-C 中发现给定类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810628/