Objective C 类别 类 中的参数如何解析方法调用?

How method calls are resolved by argument in category classes in Objective C?

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

的特定 child

假设对于根 class R,Child classes 是 C1 和 C2。

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

我有一个基本的 DataManager class,我在其中 声明了 这个方法 - 从哪里可以访问它 - 并且没有其他声明:

//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.

方法1的实现在于DataManager+C1和DataManager+C2。

但是我没有看到多态行为。

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

位于相同 class 层次结构中的 object 上的类别数如何解析函数调用?

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

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

示例:

[DataManager Method1:nil];

... 不是 select 多态目标,因为目标是具体的 class DataManager。它总是将消息发送到 DataManager.

中的实现

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

中的实例方法实现
- (void)foo
{
    [[self class] Method1:nil];
}

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

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