Smalltalk в примерах/Основы: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 53:
Следующий возникающий вопрос как наша УпорядоченнаяСовокупность создаётся. Как-никак она не появляется с помощью магии. Ответ состоит в том что мы просим <i>класс</i> УпорядоченнаяСовокупность создать два <i>экземпляра</i> УпорядоченнойСовокупности. Следующий код показывает как создаются, и присваиваются переменным, два экземпляра УпорядоченнойСовокупности (:= это оператор присвоения).
 
<font color = "blue"><pre>
\begin{verbatim}
телефонныеСообщения := УпорядоченнаяСовокупность новый.
действия := УпорядоченнаяСовокупность новый.
</pre></font>
\end{verbatim}
 
Таким образом наряду с тем что класс хранилище для кода он ещё является фабрикой создающей экземпляры себя. Точно так же как автомобильный завод производит машины фабрика (класс) УпорядоченнаяСовокупность производит УпорядоченныеСовокупности. Фабрика содержит проект для создания объектов, и шаблон на который похож объект - для данных содержащихся в нём.
Строка 80:
Если вы не писали код для СортированойСовокупности, она должна наследовать всё что написано для УпорядоченнойСовокупности. Фактически, если вы не изменили некоторое поведение, совсем не имеет смысла создавать новый класс. К счастью, СортированаяСовокупность имеет некоторые отличия в поведении. Есть два типа различий в поведении. Первое, некоторые сообщения должны делать различные вещи. Например, отправка сообщения <tt>добавить:</tt> должна добавить объект в конец УпорядоченнойСовокупности, но в случае СортированойСовокупности объект надо добавить в позицию основанную на правиле сортировки для совокупности. Если мы сделаем:
 
<font color = "blue"><pre>
\begin{verbatim}
упорядоченнаяСовокупность := УпорядоченнаяСовокупность новый.
упорядоченнаяСовокупность добавить: 'xyz'
упорядоченнаяСовокупность добавить: 'def'
упорядоченнаяСовокупность добавить: 'abc'
</pre></font>
\end{verbatim}
 
и рассмотрим совокупность, строки должны быть в следующем порядке 'xyz', 'def', 'abc', в порядке в котором мы добавили их. С другой стороны, если мы сделаем:
 
<font color = "blue"><pre>
\begin{verbatim}
сортированаяСовокупность := СортированаяСовокупность новый.
сортированаяСовокупность добавить: 'xyz'
сортированаяСовокупность добавить: 'def'
сортированаяСовокупность добавить: 'abc'
</pre></font>
\end{verbatim}
 
и рассмотрим совокупность, строки будут в следующем порядке 'abc', 'def', 'xyz', в правильной отсортированной последовательности для строк. Таким образом, в СортированойСовокупности мы не должны наследовать код суперкласса для <tt>добавить:</tt>. Вместо этого мы пишем свой собственный код для метода <tt>добавить:</tt> и подменяем код определённый в УпорядоченнойСовокупности.
Строка 114:
Это означает что вы можете использовать совокупность и не заботиться о том какого она типа; вы просто посылаете сообщение <tt>добавить:</tt> и она добавляет объект в себя правильным образом. Другим примером может быть окно которое показывает графические объекты. Вместо того чтобы знать о том как изображать окружность и квадрат, окно должно просто послать сообщение графическому объекту ( например: <tt>графическийОбъект изобразиСебяНа: сам</tt>). графическийОбъект может быть квадратом или окружностью, но для окна это не важно. Оно просто посылает одинаковые сообщения независимо от типа объекта, и полагает что графическийОбъект знает как изобразить себя. На процедурном языке вы можете написать приблизительно так:
 
<font color = "blue"><pre>
\begin{verbatim}
если( графическиОбъект квадрат?)
изобразитьКвадрат( графическийОбъект)
иначе если( графическийОбъект окружность?)
изобразитьОкружность( графическийОбъект)
</pre></font>
\end{verbatim}
 
Используя полиморфизм, вы можете просто написать:
 
<code>графическийОбъект изобразитьСебяНа: мне.</code>
\begin{verbatim}
графическийОбъект изобразитьСебяНа: мне.
\end{verbatim}
 
Рассмотрим другой пример, мы имеем объект Офис который видит объекты Работник приходящих на работу. Один подход для объекта Офис спросить объект работник какого типа он работник. Если это объект Программист, объект Офис должен сказать ему начать программировать (<tt>программист начниПрограммировать</tt>). Если это служащий, объект Офис должен сказать ему отвечай на телефонные звонки (<tt>служащий отвечайНаТелЗвонки</tt>). Если это мэнеджер, объект Офис должен сказать ему работай с бумагами (<tt>мэнеджер работайСБумагами</tt>).