我有一个根班和许多子班。
我还有一个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 + C2源文件启动的,但是DataManager + C1内部的调用会被调用。 (尽管调用者可以是任何DataManager类别-这是一种极端情况)。

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

PS:
再次注意,以上方法Method1仅暴露于以根类为参数的一类(普通DataManager.h)的.h文件中。我认为这将确保使用子对象类型进行正确的调用,但是失败了。

最佳答案

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

例:

[DataManager Method1:nil];


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

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

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


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

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

关于ios - 在Objective C中如何通过类别类中的参数解决方法调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32562487/

10-09 09:00