2011-02-10 53 views
7

我对Objective-C方法重载有疑问。 Java支持方法重载与同名,不同类型参数的相同数量。但是当我尝试在Objective-C中做类似的声明时,它会抛出错误方法的重复声明。考虑下面的代码,Objective-C方法重载

/* Java */ 

int add(int i, int j); 
int add(int i, int j, int k); // Accepted 
float add(float i, float j); // Accepted 

/* Objective-C */ 

- (int)add:(int)i and:(int)j; 
- (int)add:(int)i and:(int)j and:(int)k; // Accepted 
- (float)add:(float)i and:(float)j; // Throws error 

为什么在Objective-C中不支持?有没有替代方案?

+0

我对Objective-C中的方法重载也有疑问。我很确定它不存在。 – JeremyP 2011-02-10 08:44:50

+0

当然,这不是因为你写了'flat'而不是'float'? :P:P – hauntsaninja 2011-02-10 08:54:54

回答

15

它只是在Objective-C中不受支持。它在普通的旧C中不被支持,因此Objective-C同样不会增加方法重载并不令人惊讶。为了清楚起见,这有时候会很好。通常,解决此问题的方法是在函数名称中包含有关参数的一些信息。例如:

- (int) addInt:(int)i toInt:(int)j; 
- (int) addInt:(int)i toInt:(int)j andInt:(int)k; 
- (float) addFloat:(float)i toFloat:(float)j; 
6

与此开始:

- (int)add:(int)i and:(int)j; 

这不会覆盖任何东西 - 它只是另一种方法:

- (int)add:(int)i and:(int)j and:(int)k; // Accepted 

以下没有特别因为接受Objective-C不允许使用共变异体反变异体方法声明。 Objective-C也没有基于类型的调度重载la Java和C++。

- (float)add:(float)i and:(float)j; // Throws error 

请注意,Java直接从Objective-C派生而来。