1

我将一组类添加到一个数组中,我所知道的所有类都具有相同的超类:

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

后来想拿到类对象,在上面调用一个超类的类方法。像这样的东西:

Class class = [array objectAtIndex:1];

(Country class) specificClass = class;

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

4

3 回答 3

2

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

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

然后AbstractCountry为每个单独的国家分类。

然后:

AbstractCountry *countryClass = [array objectAtIndex:n];

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

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

于 2013-06-25T15:42:19.180 回答
2

如果我猜对了,您需要一个指向类对象的变量,静态类型为具体类。

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

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

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

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

于 2013-06-25T14:42:10.620 回答
1

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

[class someMethod];

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

[Africa setPopulation:someInteger];
于 2013-06-25T14:41:52.717 回答