我在数组中添加了一组类,我知道所有类都具有相同的超类:
[array addObject:[Africa class]];
[array addObject:[Brazil class]];
[array addObject:[France class]];
稍后,我想获取类对象并在其上调用超类类方法。像这样:
Class class = [array objectAtIndex:1];
(Country class) specificClass = class;
我尝试了不同想法的变体,但无法弄清楚如何将最后一行放在代码中。
答案 0 :(得分:2)
如果我找到了你,你想要一个指向类对象的变量,静态地输入一个具体的类。
这在Objective-C中是不可能的;没有强类型的类指针。 Class class
是你能做的最好的事情。
您可以将任何已知的类方法发送到Class
类型变量...
[class alloc];
[class defaultManager];
[class myCommonClassMethod];
...没有让编译器抱怨。当然,有些示例可能会在运行时失败。
答案 1 :(得分:2)
使用适当的设计模式,您不需要知道您正在使用哪个国家/地区。
首先创建一个AbstractCountry
类,声明(并提供存根实现)您所在国家一般响应所需的所有方法(即国家可以更具体)。
然后为每个国家/地区AbstractCountry
提供子类。
然后:
AbstractCountry *countryClass = [array objectAtIndex:n];
如果你需要只存在于一个国家/地区的行为,那么要么推送存根实现(这不是非常优雅),要么测试对选择器的响应(也不是优雅)或适当地转换(脆弱)。< / p>
当然,所有这些都引出了为什么你有这个而不是实例的类的问题(虽然实例设计是相同的;考虑像UIControl和所有子类 - 控件提供控件的抽象行为而子类通过覆盖抽象方法来实现特定类型的控件。
答案 2 :(得分:1)
通常在Objective-C中你会调用这样的方法:
[class someMethod];
所以在你的情况下,让我们假装你的超类(我假设“国家”)有一个方法来设置人口或东西,它看起来像:
[Africa setPopulation:someInteger];