Установка значений переменных экземпляра Objective-C

У меня такой код:

@implementation Fraction   
{  
      int   numerator;  
      int   denominator;  
}  

    -(void) setNumerator: (int) n   
{  
    numerator = n;   
}  
    -(void) setDenominator: (int) d   
{  
    denominator = d;   
}
@end

Мне было интересно, почему в числителе должны быть и «n», и «числитель»? Например, почему вы не можете просто установить

-(void) setNumerator: (int) numerator

в отличие от:

-(void) setNumerator: (int) n
     numerator = n;
}

Извините, если это такой простой вопрос, но я начинаю с самого начала, не имея опыта программирования.


person CloudDweller    schedule 02.02.2012    source источник


Ответы (2)


Метод setNumerator используется, чтобы сообщить объекту Fraction, какое значение он должен содержать в переменной с именем numerator. Например, «Вот, мистер Дробь, пожалуйста, используйте значение n в качестве числителя». В реализации этого метода код должен иметь дело с двумя разными концепциями: переменная параметра n, содержащая новое значение, и переменная экземпляра numerator, которую необходимо изменить на значение в n; отсюда необходимость в двух разных именах. Линия

numerator = n;

буквально означает «скопировать число из n в переменную числитель».

Помните, что транзакция состоит из двух половин. Скажем, я - объект Fraction, и вы хотите, чтобы я установил числитель на 4. Вы говорите: «Установите числитель на 4 или setNumerator (4)», и это нормально, потому что вы человек, и вы можете выбрать любое число, которое хотите.

Но как скромный объект Objective-C, весь мой код был написан когда-то в прошлом; он был написан до того, как значение 4 даже бросилось в глаза. Поэтому код для setNumerator () должен быть универсальным; он должен быть написан так, чтобы сказать «установите числитель на любое значение, которое хочет человек - назовите его n». Помните, моя фактическая переменная числитель скрыта от вас; все, что вы можете сделать, это вызвать мой метод, и я должен установить переменную.

Вот почему метод должен быть написан так, чтобы использовать абстрактное имя - n - для значения, поскольку при записи метода значение неизвестно.

person Ernest Friedman-Hill    schedule 02.02.2012
comment
Вау, это было быстро, спасибо. Но мне до сих пор неясно, зачем нужны переменная параметра и переменная экземпляра. Поскольку числитель был объявлен как (int) и при выполнении метода вы даете (int) значение, подобное 4, почему нам нужно сначала присвоить n значение 4, а затем передать его в числитель? - person CloudDweller; 02.02.2012
comment
Я немного добавил к ответу; Надеюсь, поможет. - person Ernest Friedman-Hill; 02.02.2012
comment
Я как бы понимаю, что вы имеете в виду, и я знаю, что это я глуп, но я все еще не на 100%, почему их должно быть двое. Мы объявляем числитель как (int) и n как (int), чтобы программа знала, что будет использоваться int. Почему числитель ivar скрыт, поскольку мы не показываем его в интерфейсе? - person CloudDweller; 02.02.2012
comment
Одним словом: инкапсуляция. См. en.wikipedia.org/wiki/. Это важная концепция объектно-ориентированного программирования. - person Ernest Friedman-Hill; 02.02.2012
comment
Я понял, хорошо, теперь я понял. Итак, ivar - это выход объекта (данные, передаваемые из объекта). Таким образом, разделяя значение, полученное из метода (в данном случае «n» или «d»), а затем передавая его в переменную экземпляра («числитель» или «знаменатель»), мы создаем буфер или разделение между внутренней работой объект (метод и аргументы) и результат (ivars) Я правильно понял? - person CloudDweller; 02.02.2012
comment
Также я предполагаю, что когда метод становится более сложным, чем простой пример, который я привел, аргумент, вероятно, затем пройдет через серию методов, и поэтому имя ivar не будет таким же, как аргумент. - person CloudDweller; 02.02.2012
comment
Спасибо за вашу помощь. Очень признателен. - person CloudDweller; 02.02.2012

Я думаю, что концепция, которую вы, возможно, ищете, называется свойствами. Взгляните сюда и здесь и здесь. Свойства позволят вам устанавливать значения членов без необходимости называть параметр или вызывать метод. Вы просто присваиваете этому свойству значение.

При вызове функции вы должны назвать параметр, который вы передаете в функцию, чтобы вы могли назначить его члену класса.

person Paul Sasik    schedule 02.02.2012
comment
Спасибо, что нашли время ответить на мой вопрос. Теперь я понял концепцию. - person CloudDweller; 02.02.2012