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

Содержимое удалено Содержимое добавлено
Строка 70:
==Наследование==
 
Сейчас давайте рассмотрим другой тип совокупности --- <i>СортировануюСовокупность</i>. Наш список действий лучшэлучше представляется классом СортированаяСовокупность потому что мы предпочитаем чтобы все элементы с высоким приоритетом показывались перед элементами с низким.
 
Большая разница между СортированойСовокупностью и УпорядоченнойСовокупностью это то что при создании элементов они сортируются на основе правила которое мы можэмможем определить. Однако, большая часть поведения подобна и поэтому большынствобольшинство кода должно быть одинаковым. Досадно дублировать весь код УпорядоченнойСовокупности для СортированойСовокупности. Не только потому что надо сделать много работы, но и потому что надо такжэтакже обновлять код СортированойСовокупности если вы сделаете изменения в УпорядоченнойСовокупности.
 
Мы хотели бы чтобы СортированаяСовокупность использовала код который ужэуже написан для УпорядоченнойСовокупности, так что если код изменится, СортированаяСовокупность тожэтоже изменилась. Мы хотели бы иметь общий код когда это имеет смысл, например код для нахождения первого и последнего элемента совокупности. Мы такжэтакже хотели бы иметь различный код для случаев в разным поведением, например нахождение элемента в совокупности. Мы хотели бы чтобы СортированаяСовокупность наследовала поведение УпорядоченнойСовокупности в тех случаях когда они подобны.
 
К счастью мы можэмможем делать это используя наследование между классами. В объектно ориентированном мире, мы можэмможем сказать что один класс является <i>подклассом</i> другого класса. Так в нашэмнашем примере, СортированаяСовокупность это подкласс УпорядоченнойСовокупности. Это позволяет СортированойСовокупности наследовать весь код и переменные экзэмпляраэкземпляра УпорядоченнойСовокупности. Например, если вы хотите перебрать все элементы в СортированойСовокупности, вы посылаете сообщение <tt>делать:</tt>, которое определено в УпорядоченнойСовокупности. СортированаяСовокупность наследует код и её экзэмплярыэкземпляры могут делать то жэже самое что могут делать экзэмплярыэкземпляры УпорядоченнойСовокупности.
 
Если вы не писали код для СортированойСовокупности, она должна наследовать всё что написано для УпорядоченнойСовокупности. Фактически, если вы не изменили некоторое поведение, совсем не имеет смысла создавать новый класс. К счастью, СортированаяСовокупность имеет некоторые отличия в поведении. Есть два типа различий в поведении. Первое, некоторые сообщения должны делать различные вещи. Например, отправка сообщения <tt>добавить:</tt> должна добавить объект в конец УпорядоченнойСовокупности, но в случае СортированойСовокупности объект надо добавить в позицыюпозицию основанную на правиле сортировки для совокупности. Если мы сделаем:
 
\begin{verbatim}
Строка 96:
\end{verbatim}
 
и рассмотрим совокупность, строки будут в следующем порядке 'abc', 'def', 'xyz', в правильной отсортированной последовательности для строк. Таким образом, в СортированойСовокупности мы не должны наследовать код суперкласса для <tt>добавить:</tt>. Вместо этого мы пишэмпишем свой собственный код для метода <tt>добавить:</tt> и подменяем код определённый в УпорядоченнойСовокупности.
 
Второй случай когда мы нуждаемся в различном поведении это добавление поведения - делать что-либо что суперкласс не можэтможет делать. Например, мы должны определить алгоритм сортировки который должэндолжен использоваться экзэмплярамиэкземплярами СортированойСовокупности. Мы добавляем поведение очень легко, просто написав новый метод для СортированойСовокупности. Например в случае сортирующего алгоритма мы пишэмпишем метод <tt>сортирующийБлок:</tt> который запоминает новый алгоритм для будущего добавления и такжэтакже для пересортировки совокупности в соответствии с новым алгоритмом. Рисунок~\ref{nasledovanie} показывает пример наследования, переписывания, и добавления методов.
 
\begin{figure}[!htb]