1

如果你愿意的话,我正在自学Objective-C作为一种罪恶的乐趣。我自称对 Java 语言有很强的掌握,所以这不是一个非常困难的过渡——虽然它确实很有趣。但是,唉,我的问题!

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

在 Obj-C 中,我很难重现这种范式。我已经问过我的霸主谷歌,如何在 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 方法总是返回它所在的对象(总是父对象)。我也希望它是一个实例方法。我该怎么做呢?

-肖恩

4

2 回答 2

2

实际上,Objective C 具有一组强大的自省功能,通过参考 Apple 广泛的Objective C 运行时文档,几乎可以肯定地做你想做的事情。这是一个完整的 C API,用于访问 Objective C 的对象和类层次结构的内部工作。

如果不出意外,通过试验这些东西,你会学到很多关于语言如何工作的知识,它应该可以帮助你调试困难的问题。

于 2010-09-21T22:19:12.743 回答
0

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

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

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

于 2010-09-21T19:26:26.853 回答