【问题标题】:Call class method on object of unknown class在未知类的对象上调用类方法
【发布时间】:2013-06-22 10:08:18
【问题描述】:

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

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

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

Class class = [array objectAtIndex:1];

(Country class) specificClass = class;

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

【问题讨论】:

  • (Country class) specificClass = class; 是什么意思? [class someMethod] 不工作吗?
  • 不行,因为class是泛型类,所以调用Country方法是行不通的。
  • "并在其上调用超类类方法。"所以你想在 Country 中调用一个类方法? [国家一些方法]
  • 我从来没有玩过这个,但是class_getSuperclass 会给你一个给定类的超类。
  • (虽然我有点好奇为什么你不能简单地做[Country someMethod]。)

标签: ios objective-c class


【解决方案1】:

如果我没听错的话,你想要一个指向类对象的变量,静态类型为具体类。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    然后为每个国家/地区子类化 AbstractCountry

    然后:

    AbstractCountry *countryClass = [array objectAtIndex:n];
    

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

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

    【讨论】:

      【解决方案3】:

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

      [class someMethod];
      

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

      [Africa setPopulation:someInteger];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多