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

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