我有一个根类和一些子类。我还有一个DataManager类,它应该在各种类别中保存静态方法,这些方法作用于这个根类的特定子类。
假设对于根类R,子类是C1 &C2。
对于C1,我有一个名为datamemanager +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中的Method1,尽管调用本身是从DataManager+C2源文件发起的。(调用者可以是任何DataManager类别——这是一个极端的情况)。
在同一类层次结构中的对象的类别数量如何解决函数调用?
PS:再次注意,上面的方法Method1只暴露在一个类(普通datamemanager .h)的.h文件中,根类作为参数。我认为这将确保使用子对象类型正确调用,但它失败了。
当消息的目标实际上是多态时,Objective-C支持类方法的多态性。
的例子:
[DataManager Method1:nil];
…将not多态选择目标,因为目标是具体类DataManager
。它总是将消息发送到DataManager
中的实现。
另一方面,如果目标是动态确定的,则实际存在预期的多态。一个典型的例子是在同一个类或子类中的实例方法实现:
- (void)foo
{
[[self class] Method1:nil];
}
这将调用Method1:
最接近的重写实现,从而授予多态行为。
旁注:上面描述的行为不受类别的影响。如果没有名称冲突,类别对如何分派消息几乎没有影响。