3

关于是否可以在 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;

(以及冲突返回值的类似物),当 A)ClassB从 下降ClassA和 B) 不是时。

4

2 回答 2

7

问题1:不可以:Objective-C 不包括方法名中的类型;没有损坏。它可能适用于 Objective-C++ —— 从来没有用过那么多。

问题2:一样。不会工作。

问题3:会工作。

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

于 2012-07-07T10:42:18.967 回答
1

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

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

如果您想要更健壮的行为,您的方法可以查询传入的对象是否响应某些选择器并基于此采取适当的操作。或者你的方法可以询问传入的对象是否是它期望的类型。同样,这一切都将在您的方法的运行时完成。不是由编译器。

所以答案是,声明为:

- (void) doSomethingWithObject:(id) object;

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

于 2012-07-08T06:05:26.870 回答