Smalltalk в примерах/Объект

Материал из Викиучебника — открытых книг для открытого мира

Смолток это система с \emph{корнем}, что означает что есть корневой класс от которого образуются все другие классы. Таким корневым суперклассом является \emph{Объект}. (В действительности, корневым является другой класс, и ты можешь увидеть его просмотрев \verb|Класс| \verb|кореньМира|. Однако, для большинства прикладных случает ты можешь рассматривать Объект просто как корневой класс.)


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


Метод доступа[править]

Сообщение \verb|от:| возвращает объект определённый индексом, в то время как \verb|от:поместить:| помещает объект по указанному индексу. Сообщение \verb|размер| возвращает количество количество индексируемых полей в объекте. Эти сообщения работают только для индексируемых объектов, т.е. для совокупностей. Подобные методы, \verb|простойОт:|, \verb|простойОт:поместить:|, и \verb|простойРазмер| делают те же самые вещи но никогда ни должны переопределяться подклассами. Их назначение --- предоставить тебе функциональность \verb|простых| методов и чтобы ты не волновался что некоторый промежуточный суперкласс мог переопределить их. \verb|тысам| возвращает получателя сообщения. Оно часто используется в каскадах чтобы быть уверенным что возвращается правильный объект. Например, в выражении \verb|список| \verb|:=| \verb|Список| \verb|новый| \verb|добавить:1;| \verb|тысам|, \verb|тысам| помещает в переменную список вместо числа один.


Изменение[править]

Сообщения \verb|изменился|, \verb|изменился:|, и \verb|изменился:с:| все используются для того, чтобы отправить извещение о зависимости. Обычным использованием этих сообщения является посылка объектом сообщения самому себе когда он изменяется, и все зависящие от него объекты будут проинформированы. Мы будем рассматривать механизм зависимостей в Главе \potom, \potom. Сообщение \verb|запросНаИзменение| посылается, когда программа хочет измениться и спрашивает у зависимых объектов согласие на изменение. Твоя программа может переопределить \verb|запросНаИзменение| \potom.


Принадлежность классу[править]

Сообщение \verb|пренадлижитК:| овтечает принадлижит ли получатель к данному классу, \verb|происходитОт:| овечает принадлежит ли получатель к данному классу или к одному из его подкласов, и \verb|отвечаетНа:| отвечает, понимает ли получаетль данное сообщение. Использование всех трёх методов часто указывает на то что ты думаешь процедурно, что ты не используешь правильно полиморфизм. Эти три метода нужно как правило избегать. Сообщение \verb|класс| даёт тебе класс экземпляром которого является получатель.


Сравнение[править]

Сообщение \verb|==| говорит тебе, является ли получатель и параметр \emph{одним и тем же} объектом. Сообщение \verb|=| говорит тебе, являются ли получатель и параметр равными. Например, две строки с одинаковыми буквами это не один и тот же объект, но они равны, т.е. \verb|==| возвращает \emph{лож} а \verb|=| возвращает \emph{истина}. Т.к. различные классы имеют различные критерии для принятия решения, что объекты равны (напрмер, два объекта Сотрудник могут быть равны когда у них одинаковый номер социального страхования), по умолчанию \verb|=| просто вызывает \verb|==|, оставляя подклассу переопределние \verb|=| для более подходящего поведения. (Ты никогда не должен переопределять \verb|==|.) \verb|=| и \verb|==| соответствуют \verb|~=| и \verb|~~|, не равенство и не эквивалентность. Сообщение \verb|хэш| возвращает хэш значение объекта, и должно быть переопределно всегда, когда ты переопределяешь \verb|=| потому что два равных объекта должны иметь равные значения хэшэй. За дальнейшэй информацией об этом обращайся к Главе \potom, \potom.


Преобразование[править]

\potom


Копирование[править]

\potom


Выбор зависимостей[править]

Сообщение \verb|добавитьЗависимость:| и \verb|удалитьЗависимость:| предоставляют основной механизм для установления и разрывания отношения зависимости к другому объекту. Сообщения \verb|!!!| и \verb|!!!| предоставляют более сложные механизмы. Более подробная информацыя об этих сообщениях имеется в Главе \potom, \potom.


Обработка ошибок[править]

Сообщение \verb|ответственностьПодкласса| предназначено для методов, которые должны быть переопределены подклассами. Типичным использованием этого метода суперклассом --- \verb|сам| \verb|ответственностьПодкласса|. Если подкласс не переопределил метод будет вызвано исключение. Противоположное сообщение, \verb|неДолжэнРеализовывать| предназначен методам подклассов чтобы показать что хотя подкласс наследует метод, он не является подходящим поведением для него. Сообщения \verb|останов|, \verb|останов:|, \verb|ошыбка:| и \verb|известить:| используются для генерации исключения и открытия окна Отладчика/Уведомителя (например \verb|сам| \verb|останов|). Сообщения \verb|errorSignal| и \verb|сообщениеНеСогласованоSignal| возвращают signals которые могут быть использованы в signal handlers to trap exeptions. Сообщение \verb|неПонял:| посылается, когда получатель не понимает сообщения, и это обычное поведение для вызова окна Отладчика/Уведомителя. Переопредели этот метод, если ты хочешь поймать сообщение, которое не понято если ты можешь послать его затем другому объекту. Я использую этот механизм в Главе \potom, \potom.


Ввод/Вывод в файл[править]

Сообщения \verb|двоичноеПредставление| и \verb|представитьВДвоичномВидеНа:| предоставляют специальное поведение для использования с BOSS facility когда сохраняются и восстанавливаются двоичные объекты. Практически, переопределив \verb|представитьВДвоичномВидеНа:| ты можешь определить, как ты хочешь сохранять объект. Возвращение \emph{nil} (реализацыя по умолчанию) говорит о сохранении представления получателя по умолчанию. Возвращение 0 говорит о том что объект не надо сохранять. Другое часто возвращаемое значение это \emph{MessageSend}, которое предоставляет способ для сохранения объекта в одной форме и восстановления его в другой форме.


Инициализация освобождения[править]

Сообщение \verb|освободить| разрывает все зависимости, которые могут быть установлены с данным объектом. Оно посылается, когда объект больше не нужен и позволяет поместить объект в кучу.


Обработка сообщений[править]

Группа методов \verb|выполнить:| позволяет тебе создавать имя метода во время выполнения программы и затем вызывать его. Это широко используется, когда ты не знаешь имени метода во время компиляции и узнаёшь его во время выполнения программы. Напрмер, пользовательский интерфейс исползует его часто, т.к. имена методов доступа к переменным и меню определяются пользователем во время создания пользовательского интерфейса, но основной его код, это часть системных классов. Мы будем говорить о сообщениях \verb|выполнить:| в Главе \potom, \potom и мы будем использовать его в Главе \potom, \potom.


Печать[править]

Наиболее часто используемыми методами из протокола печати являются \verb|напечататьСтроку|, \verb|напечататьНа:| и \verb|показатьСтроку|. Ты посылаешь \verb|напечататьСтроку| объекту, чтобы получить его печатное представление, которое может быть показано на Транскрипте. Сообщение \verb|напечататьСтроку| вызывает \verb|напечататьНа:|, таким образом чтобы переопределить что возвращает \verb|напечататьСтроку| ты переопределяешь \verb|показатьНа:|. Сообщение \verb|показатьСтроку| возвращает более подходящее представление объекта для использования в labels и list boxes (SequenceViews). Это является обычным для \verb|напечататьСтроку| но это переопределяется для такого класса, как Строка.


System primitives[править]

\potom


Тестирование[править]

Протокол содержит методы, которые возвращают \emph{истину} и \emph{ложь}. Большинство из методов возвращают \emph{лож}, позволяя затем переопределить их если нужно. Например, \verb|целое?| возвращает \emph{ложь} но оно переопределено для Целого, чтобы возвращать \emph{истину}. Сообщение \verb|isBehaviour| отвечает на вопрос может ли получатель быть классом другого объекта. Сообщение \verb|непостредственный?| отвечает является ли получатель непосредственным объектом таким как МалоеЦелое или Буква которые могут быть представлены с помощью тридцати двух битов, или получатель представляется с помощью указателя на объект. Сообщения \verb|ноль?| и \verb|неНоль?| отвечают является ли объект нулём и переопределены для НеопределённоваОбъекта. Сообщение \verb|упорядочен?| говорит является ли объект упорядоченной совокупностью --- т.е. подклассом УпорядоченнойСовокупности. Сообщение \verb|строка?| отвечает является ли объект строкой, и \verb|символ?| является ли он Символом. Сообщение \verb|respondToArithmetic| говорит принадлежыт ли объект к подклассу АрифметическойВеличены.


Использование тестирующих сообщений позволяет тебе избегать таких методов как \verb|isKindOf:| и \verb|isMemberOf:|. В твоих собственных классах используй сообщения типа \verb|xxx?| если тебе надо определить имеет ли объект данный тип. Например, допустим у тебя есть класс Ответчик с подклассами УспешныйОтветчик и НеуспешныйОтветчик. В Ответчике определи методы \verb|ответчик?|, \verb|успешныйОтветчик?| и \verb|неуспешынйОтветчик?|, первый позвращает \emph{истину} а следующие два \emph{лож}. УспешныйОтветчик должен переопределить сообщение \verb|успешныйОтветчик?| так чтобы оно возвращало \emph{истину}, и НеуспешныйОтветчик должен переопределить \verb|неуспешныйОтветчик?| так чтобы оно возвращало \emph{истину}. Если у тебя много населдуемых объектов для которых ты хочеш определить сообщение типа \verb|xxx?|, рассмотри возможность создания ОбъектаПрограммы который является подклассом Объекта, где ты определиш набор методов \verb|xxx?|, каждый из которых возвращает \emph{лож}. Затем в каждом классе наследнике ты переопределяеш соответствуюищй тестирующий метод так, чтобы он возвращал \emph|истину|.


Обновление[править]

\potom

Совокупности →