Objective-C后期静态绑定

时间:2010-09-21 16:15:22

标签: objective-c inheritance dynamic-binding late-static-binding

如果你愿意的话,我正在教自己Objective-C是一种内疚的快乐。我自称对Java语言的强烈掌握,因此它不是非常困难的过渡 - 它确实很有趣。但是,唉,我的问题!

我正在尝试重现PHP中存在的东西:Late Static Binding。在PHP中,我可以用“static ::”修饰一个方法调用,它将在运行时将该方法动态地绑定到调用者。另一方面,如果使用关键字“self ::”,则绑定是静态的,并且与它所在的类相关联,而不管哪个子类调用它。

在Obj-C中,我很难再现这种范式。我问过我的霸主Google,如何在Cocoa中静态绑定,但我不认为这是可能的。它可能被称为其他东西,或者它可能需要一个非常过头的解决方法。这就是我现在正在做的事情:

父类方法:

-(id) whoAmI {
 return ([self class]);
}

子类ChildClass扩展ParentClass并且不覆盖实例方法whoAmI。

NSLog(@"Calling from PARENT: %@", [parent whoAmI]);
NSLog(@"Calling from CHILD: %@", [child whoAmI]);

当我将消息发送到每个类对象时,动态绑定会执行它应该执行的操作,并且我从NSLog()获得以下内容:

2010-09-21 11:39:07.484 WhoAmI [4803:a0f]来自父母的电话:家长 2010-09-21 11:39:07.486 WhoAmI [4803:a0f]来自孩子的呼唤:孩子

最终,我想学习 - 如果可能 - 如何让Cocoa停止动态绑定,以便whoAmI方法始终返回它所驻留的对象(总是为Parent)。我也希望它是一个实例方法。我该怎么做呢?

-Sean

2 个答案:

答案 0 :(得分:2)

实际上,Objective C有一套强大的内省功能,几乎可以肯定的是,通过引用Apple广泛的Objective C Runtime documentation来做你想做的事情。这是一个完整的C API,用于访问Objective C的对象&的内部工作。类层次结构。

如果没有别的,通过试验这些东西,你将学到很多关于语言如何工作的知识,它可以帮助你调试困难的问题。

答案 1 :(得分:0)

更改方法以合并Parent类(或超类)的名称:

-(id) whoAmI {
 return ([Parent class]);    //In this instance, Parent is the superclass
}

恰好,我希望创建的东西必须通过将我的类消息静态绑定到父类本身来实现:Parent。