【问题标题】:How method calls are resolved by argument in category classes in Objective C?Objective C中类别类中的方法调用如何通过参数解析?
【发布时间】:2015-09-14 10:25:00
【问题描述】:

我有一个根类和多个子类。 我还有一个 DataManager 类,它应该包含各种类别的静态方法,这些方法作用于这个根类的特定子类。

假设根类 R,子类是 C1 和 C2。

对于 C1,我有一个名为 DataManager+C1 的类别。
对于 C2,我有一个名为 DataManager+C2 的类别。

我有一个基本的 DataManager 类,我在其中 声明了这个方法 - 可以从任何地方访问它 - 并且没有其他声明

//DataManager.h
+ (NSDictionary *) Method1 : (DataModelRoot*) R;
//Note that R is my root class. Individual class implementations belong to DataManager+C1.m, DataManager+C2.m etc.

Method1的实现在于DataManager+C1和DataManager+C2。

但我看不到多态行为。

也就是说,当期望调用 DataManager+C2 的 Method1 时,调用 DataManager+C1 内部的调用,尽管调用本身是从 DataManager+C2 源文件启动的。 (虽然调用者可以是任何 DataManager 类别 - 这是一种极端情况)。

位于同一类层次结构中的对象的类别数量如何解决函数调用?

PS: 再次注意,上述方法 Method1 仅在一个类(普通 DataManager.h)的 .h 文件中公开,以根类作为参数。我认为这将确保使用子对象类型正确调用,但它失败了。

【问题讨论】:

  • 类方法怎么调用?请发布实际调用的代码。

标签: ios objective-c oop polymorphism objective-c-category


【解决方案1】:

当消息的目标实际上是多态时,Objective-C 支持类方法的多态。

例子:

[DataManager Method1:nil];

...不会多态地选择目标,因为目标是具体类DataManager。它只会始终将消息发送到DataManager 中的实现。

另一方面,如果目标是动态确定的,则如预期的那样存在实际的多态性。一个典型的例子是在同一个类或子类中的实例方法实现:

- (void)foo
{
    [[self class] Method1:nil];
}

这确实会调用Method1: 的最接近的重写实现,从而授予多态行为。

旁注:上述行为不受类别影响。如果没有名称冲突,类别对消息的发送方式几乎没有影响。

【讨论】:

  • +1 谢谢。使 Method1 成为 DataManager 的实例方法可以实现我的愿望吗?通过参数实现多态的方法是什么?我为 R 的每个子类定义了 DataManager 类别,并且不可能派生 DataManager 本身 - 至少在这个时候。
  • 我不确定你所说的“多态性”是什么意思。 Objective-C 通过在第一个参数(消息的目标)上分派来提供多态性。它没有给你一些语言所说的“多重调度”。此外,objc 没有重载(这完全是另一回事)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多