对未知类的对象调用类方法

我在数组中添加了一组类,我知道它们都具有相同的超类:

[array addObject:[Africa class]]; [array addObject:[Brazil class]]; [array addObject:[France class]]; 

后来,我想获取类对象并在其上调用超类类方法。 像这样的东西:

 Class class = [array objectAtIndex:1]; (Country class) specificClass = class; 

我尝试了不同想法的变体,但无法弄清楚如何将最后一行放在代码中。

如果我找到了你,你想要一个指向类对象的变量,静态地输入一个具体的类。

这在Objective-C中是不可能的; 没有强类型的类指针。 Class class是你能做的最好的。

您可以将任何已知的类方法发送到Class类型的变量…

 [class alloc]; [class defaultManager]; [class myCommonClassMethod]; 

……没有让编译器抱怨。 当然,某些示例可能在运行时失败。

使用适当的设计模式,您不需要知道您正在使用哪个国家/地区。

首先创建一个AbstractCountry类,声明(并提供存根实现)您的国家需要通用的所有方法(即国家可以更具体)。

然后为每个国家的AbstractCountry子类化。

然后:

 AbstractCountry *countryClass = [array objectAtIndex:n]; 

如果您需要仅存在于单个国家/地区的行为,则要么推送存根实现(这不会非常优雅),要么测试对选择器的响应(也不是优雅)或适当地转换(脆弱)。

当然,所有这些都引出了为什么你有这个而不是实例的类的问题(虽然实例设计是相同的;考虑像UIControl和所有子类 – 控件提供控件的抽象行为而子类通过覆盖抽象方法来实现特定类型的控件。

通常在Objective-C中你会调用一个这样的方法:

 [class someMethod]; 

所以在你的情况下,让我们假装你的超类(我假设“国家”)有一个方法来设置人口或东西,它看起来像:

 [Africa setPopulation:someInteger];