Smalltalk в примерах/Объект: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
(нет различий)

Версия от 04:41, 6 апреля 2007

Смолток это система с \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