Перегрузка функций в Objective-C?

Эксперты C, насколько я понимаю, Objective-C - это язык динамической привязки, который не позволяет перегружать какой-либо метод в классе.

Но меня раздражает одна вещь, если я пишу два метода с одинаковым именем, но с разным количеством списков параметров, например:

 // Which is not allowed in objective-c

 -(void)updateValue:(int)intVal{

  } 

 -(void)updateValue:(float)floatVal{

  }

Но второй случай, который позволяет Objective-C:

 // Allowed in Objective-C

 -(void)updateValue:(int)intVal{

   }

 -(void)updateValue:(float)floatVal :(int)intVal{

   }

Хотя оба случая являются перегрузкой метода.

Теперь мой вопрос, почему разрешен второй случай.

Изменяет ли метод с двумя параметрами во втором случае имя метода? или что-то другое ?

Пожалуйста, объясните.


person Nisar Ahmad    schedule 27.09.2017    source источник
comment
Никогда не пишите -(void)updateValue:(float)floatVal :(int)intVal. Хотя бы напишите -(void)updateValue:(float)floatVal andSomething:(int)intVal. В противном случае сигнатурой являются -updateValue:, -updateValue:: (если нет введения параметра) и -updateValue:andSomething:.   -  person Larme    schedule 27.09.2017


Ответы (2)


Изменяет ли метод с двумя параметрами во втором случае имя метода?

да. Имя метода представляет собой соединение всех префиксов его параметров, включая двоеточия. Итак, ваши два метода: updateValue: и updateValue::.

ХТН

person CRD    schedule 27.09.2017

-(void)updateValue:(int)intVal
  {
  } 

 -(void)updateValue:(float)floatVal
  {
  }

Это не разрешено, так как когда пользователь вызывает updateValue с параметром, то из-за приведения типа значение может измениться, и будет показан неоднозначный метод.

 -(void)updateValue:(int)intVal
   {
   }

  -(void)updateValue:(float)floatVal :(int)intVal
  {
  }

допускается, поскольку количество параметров отличается, поэтому компилятор знает, какой метод вызывать, и когда такой неоднозначный вызов метода не является их

person Nupur Gupta    schedule 27.09.2017