Теперь, когда я показал, что классы являются объектами и им могут быть отправлены сообщения, вы можете удивиться — зачем тогда вообще нужны экземпляры? Почему для объектно-ориентированного программирования недостаточно существования классов как объектов?

Зачем вообще заниматься созданием экземпляров классов? Почему бы не писать вообще весь код как методы классов, а программу — как отправку сообщений от одного класса к другому?

Ответ заключается в том, что экземпляры обладают одной особенностью, которой нет у классов: переменными экземпляра. Переменная экземпляра представляет собой именно то, что следует из ее названия: это переменная, принадлежащая экземпляру. Подобно методам экземпляров, переменные экземпляров определяются как часть класса. Однако значение переменной экземпляра устанавливается во время работы программы и принадлежит только одному экземпляру. Иными словами, разные экземпляры могут иметь разные значения одной и той же переменной экземпляра.

Предположим, например, что у нас есть класс Dog и мы решили, что каждая собака должна иметь имя. Имя реального пса можно узнать по надписи на его ошейнике. Вот так же мы хотим иметь возможность назначать имя каждому экземпляру класса Dog, а впоследствии иметь возможность получать это имя. Поэтому при проектировании класса Dog мы объявляем, что этот класс имеет переменную экземпляра с именем паше, значение которого представляет собой строку (вероятно, типа NSString, так как мы используем Objective-C). Теперь при работе нашей программы мы можем создать собаку (экземпляр класса Dog) и дать этой собаке имя (то есть присвоить значение переменной экземпляра паше). Мы можем создать экземпляр класса Dog вновь и дать другое имя этому новому экземпляру класса. Скажем, это два разных имени: одно — @ "Тузик", а второе — @ "Шарик". В результате у нас есть два экземпляра класса Dog, которые отличаются значениями их переменных экземпляра паше (рис. 2.3).

Таким образом, экземпляр является отражением методов экземпляра своего класса, но это не все; он также является совокупностью переменных экземпляра. Класс отвечает за то, какие переменные имеются у экземпляра, но не за значения этих переменных. Значения могут изменяться в процессе работы программы, и применимы они только к конкретному экземпляру. Экземпляр по сути представляет собой кластер значений переменных конкретного экземпляра.

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

 Переменные экземпляров

Рис. 2.3. Переменные экземпляров


 

 

 

Добавить комментарий