Objective-C方法覆盖/重载混淆

时间:2012-07-07 10:00:31

标签: objective-c

对于Objective-C中是否有可能“重载”方法,似乎存在一些争论/不同意见。暂且不能在Objective-C中定义方法重载是与C ++相同的术语(因为方法签名语法不同),我特别要问:以下哪一项是允许的,哪些不是?

1)宣布/实施这两种方法的类:

- (void) doSomethingWithObject:(ClassA*) object;
- (void) doSomethingWithObject:(ClassB*) object;

2)宣布/实施这两种方法的类:

- (void) doSomethingWithObject:(ClassA*) object;
- (BOOL) doSomethingWithObject:(ClassA*) object;

3)宣布/实施此方法的类:

- (void) doSomethingWithObject:(ClassB*) object;

...当其超类声明/实现此方法时:

- (void) doSomethingWithObject:(ClassA*) object;
当p)ClassBClassA下降,而B)不是。

时,

(以及冲突返回值的模拟)

2 个答案:

答案 0 :(得分:7)

问题1:无法做到:Objective-C不包括方法名称中的类型;没有破坏。它可能适用于Objective-C ++ - 从未使用过那么多。

问题2:相同。不行。

问题3:会奏效。

编辑:一般来说,方法名称不包含任何类型,因此如果您删除类型并且它们是相同的,那么它将被视为相同,因此不允许在同一个类中。同样,如果它在不同的类中它会起作用,尽管如果调用中使用的类型和被调用的类型不完全一致,你可能会感到困惑。

答案 1 :(得分:1)

您正在考虑C ++,其中编译器执行静态绑定,根据输入的类型确定要调用的实例方法。

Objective-C无法正常工作。相反,所有绑定在运行时都是动态的。有点像在C ++中声明为“虚拟”的所有方法。程序员负责传递适当的变量,这些变量以您的方法所期望的方式响应。

您的方法可以查询传入的对象是否响应某些选择器,并根据需要采取适当的操作,如果您需要更强大的行为。或者你的方法可以询问传入的对象是否是它所期望的类型。同样,这将在您的方法中在运行时完成。不是由编译器。

所以答案是,声明为:

- (void) doSomethingWithObject:(id) object;

...然后传入你喜欢的任何对象。