2011-02-10 7 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

+0

уверен, что это не потому, что вы написали «flat» вместо «float»? : P: P – hauntsaninja

+0

@hauntsaninja: :) спасибо .. Я исправил его сейчас. – EmptyStack

ответ

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 

Следующая не принято именно потому, что Объектив-C не допускает со-вариант или контравариант объявления метода. Кроме того, Objective-C не использует тип отправки, перегружающий la Java и C++.

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

Обратите внимание, что Java была получена непосредственно из Objective-C.

+0

+1 для * «Objective-C не допускает ковариантные или противоречивые декларации метода» * – EmptyStack

Смежные вопросы