对于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)ClassB
从ClassA
下降,而B)不是。时,(以及冲突返回值的模拟)
答案 0 :(得分:7)
问题1:无法做到:Objective-C不包括方法名称中的类型;没有破坏。它可能适用于Objective-C ++ - 从未使用过那么多。
问题2:相同。不行。
问题3:会奏效。
编辑:一般来说,方法名称不包含任何类型,因此如果您删除类型并且它们是相同的,那么它将被视为相同,因此不允许在同一个类中。同样,如果它在不同的类中它会起作用,尽管如果调用中使用的类型和被调用的类型不完全一致,你可能会感到困惑。
答案 1 :(得分:1)
您正在考虑C ++,其中编译器执行静态绑定,根据输入的类型确定要调用的实例方法。
Objective-C无法正常工作。相反,所有绑定在运行时都是动态的。有点像在C ++中声明为“虚拟”的所有方法。程序员负责传递适当的变量,这些变量以您的方法所期望的方式响应。
您的方法可以查询传入的对象是否响应某些选择器,并根据需要采取适当的操作,如果您需要更强大的行为。或者你的方法可以询问传入的对象是否是它所期望的类型。同样,这将在您的方法中在运行时完成。不是由编译器。
所以答案是,声明为:
- (void) doSomethingWithObject:(id) object;
...然后传入你喜欢的任何对象。