Фэндом

Smalltalk по-русски

Смолток. Язык и его реализация/Первая часть/4. Подклассы

< Смолток. Язык и его реализация | Первая часть

239статей на
этой вики
Добавить новую страницу
Обсуждение0 Поделиться
4.0.jpg

ПодклассыПравить

Каждый объект в системе Смолток это экземпляра класса. Все экземпляры класса представляют один и тот же вид компонентов. Например, каждый экземпляр Прямоугольника представляет прямоугольную область и каждый экземпляр Словаря представляет набор связей между именами и значениями. Тот факт что экземпляры все класса представляют один и тот же вид компонентов отражается в способе которым экземпляры отвечают на сообщения и в форме их переменных экземпляра.

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

Структура классов описанная до сих пор не предоставляет возможности объектам принадлежать к нескольким классам. Каждый объект это экземпляр только одного класса. Эта структура показаны на рисунке 4.1. На рисунке маленькими кружками представлены экземпляры и прямоугольниками классы. Если кружок находится в прямоугольнике то он представляет экземпляр класса представленного прямоугольником.

4.1.jpg

Рисунок 4.1

Отсутствие пересечений между членами классов это ограничение в структуре объектно-ориентированной системы т.к. не позволяется пересечений между описаниями классов. Мы можем захотеть иметь два объекта с почти идентичных, но различающихся в отдельных чертах. Например числа с плавающей точкой и целые числа похожи возможностью отвечать на арифметические сообщения, но они отличаются способом представления численных значений. Упорядоченная совокупность и bag похожи тем что они являются хранилищами для объектов которые можно добавлять и удалять, но они различаются способом доступа к индивидуальному элементу. Различия между другими похожими объектами могут быть видны снаружи, такие как возможность отвечать на некоторые отличные сообщения или различия могут быть полностью внутренними, такими как ответ на одно и то же сообщения с помощью выполнения различных методов. Если не допускается принадлежность к различным классам то система не может гарантировать данные типы похожести между двумя объектами.

Наиболее общий вид преодолеть это ограничение это позволить произвольное пересечение между классами (рисунок 4.2).

4.2.jpg

Рисунок 4.2

Мы называем этот подход множественным наследованием. Множественное наследование позволяет ситуации когда объект является экземпляром нескольких классов, в то время как другие объекты это экземпляры только одного или другого класса. Менее общее ограничение чем не пересечение границ класса это позволить классам включать все экземпляры другого класса, но не позволять более общего разделения (рисунок 4.3).

4.3.jpg

Рисунок 4.3

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

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

Описание подклассаПравить

Подкласс определяет что его экземпляры должны быть такими же как и экземпляры другого класса, называемого суперклассом, за исключением различий которые явно указаны. Программист Смолтока всегда создаёт новый класс как подкласс существующего класса. Класс системы называемый Объект описывает общие черты всех объектов в системе, поэтому каждый класс должен быть по крайней мере подклассом Объекта. Описание (протокола или реализации) класса определяет чем его экземпляры отличаются от экземпляров суперкласса. На экземпляры суперкласса не может влиять существование подклассов.

Подкласс это тоже класс и поэтому тоже может иметь свои подклассы. Каждый класс имеет один суперкласс, однако многие классы могут разделять один и тот же суперкласс, т.е. классы образуют древовидную структуру. Класс имеет последовательность классов от которых он наследует и переменные и методы. Эта последовательность начинается с его суперкласса и продолжается суперклассом суперкласса, и т.д.. Последовательность наследования продолжается до тех пор пока не дойдёт до класса Объект. Объект это единственный корневой класс, это единственный класс без суперкласса. Напомним что описание реализации содержит три основных части:

  1. Имя класса
  2. Объявление переменных
  3. Набор методов

Подкласс должен иметь имя для себя, но он наследует и объявления переменных и методы своего суперкласса. Подкласс может добавить новые переменные и новые методы. Если в подклассе добавлено объявление имён переменных экземпляра, то экземпляры подкласса будут иметь больше переменных экземпляра чем экземпляры суперкласса. Если добавлены разделяемые переменные, то будут доступны экземплярам подкласса, но не экземплярам суперкласса. Все имена переменных должны отличаться от имён объявленных в суперклассе.

Если класс не имеет нумерованных переменных экземпляра, подкласс может объявить что у его экземпляров будут нумерованные переменные, эти переменные будут добавлены ко всем унаследованным переменным экземпляра. Если класс имеет нумерованные переменные экземпляра его подкласс тоже должен иметь нумерованные переменные экземпляра, подкласс также может добавить новые именованные переменные экземпляра.

Если подкласс добавляет метод с образцом имеющим селектор совпадающий с селектором метода в суперклассе, то его экземпляры будут отвечать на сообщение с данным селектором выполняя новый метод. Это называется переопределение метода. Если подкласс добавляет метод с селектором не содержащимся в суперклассе, то экземпляр подкласса будет отвечать на сообщения которые не понимают экземпляры суперкласса.

Подвидём итоги, каждая часть описания реализации может быть изменена подклассом различными способами:

  1. Имя класса должно быть переопределено
  2. Можно добавлять переменные
  3. Методы могут быть добавлены или переопределены

Пример подклассаПравить

Описание реализации содержит раздел не указанный в предыдущих главах, он определяет суперкласс. В следующем примере описан класс созданный как подкласс класса Финансовая история введённого в третьей главе. Экземпляра подкласса разделяют функции Финансовой истории для хранения информации о поступлении и трате денег. Они имеет дополнительные функции для отследживания трат которые облагаются налогом. Подкласс определяет обязательное новое имя для класса (Налоговая история), и добавляет одну переменную экземпляра и четыре метода. Один из этих методов (начальный баланс:) переопределяет метод суперкласса.

имя класса Налоговая история

имена переменных экземпляра расходы на налоги

методы экземпляра
запись транзакций
потратить на налоги: количество на: причина
   сам потратить: количество на: причина.
   расходы на налогирасходы на налоги + количество.

потратить: количество на: причина вычесть: размер налога
   сам потратить: количество на: причина.
   расходы на налогирасходы на налоги + размер налога.

справки
всего налогов
   расходы на налоги.
инициализация
инициализировать баланс: количество
   супер инициализировать баланс: количество.
   расходы на налоги0.

Для того чтобы знать все сообщения понимаемые экземплярами Налоговой истории нужно просмотреть протоколы классов Налоговая история, Финансовая история и Объект. Экземпляры Налоговой истории имеют четыре переменных - три унаследованных от суперкласса Финансовая история, и одну определённую в классе Налоговая история. Класс Объект не определяет переменных экземпляра. Рисунок 4.4. показывает что Налоговая история это подкласс Финансовой истории. Каждый прямоугольник на данной диаграмме помечен в верхнем левом углу с помщью имени класса который он представляет.

4.4.jpg

Рисунок 4.4

Экземпляры Налоговой истории могут быть использованы для записи истории трат таких сущностей траты которых облагаются налогом (люди, домохозяйства, организации). Экземпляры Финансовой истории могут быть использованы для записи истории трат сущностей траты которых не облагаются налогом (благотворительные оргаризации, религиозные организации). В действительности экземпляр Налоговой истории может быть использован вместо Финансовой истории без видимых эффектов до тех пор пока он отвечает на те же сообщения таким же образом. В добавок к сообщениям наследуемым от Финансовой истории, экземпляр Налоговой истории может отвечать на сообщения указывающие что все или часть трат облагаются налогом. Новые доступные сообщения: потратить на налоги:на: которое используется если вся сумма это налог и потратить:на:вычесть: которое используется если только часть трат является налогом. Общую сумму налогов можно узнать послав сообщение всего налогов Налоговой истории.

Нахождение методаПравить

При посылке сообщения ищется метод в классе получателя с совпадающим селектором. Если такой не находится то ищется метод в суперклассе класса. Поиск продолжается до тех пор пока не будет найден соответствующий метод. Допустим мы послали экземпляру Налоговой истории сообщение с селектором количество наличных. Поиск подходящего метода для выполнения начинается в классе получателя, Налоговой истории. Когда он там не находится, то поиск продолжается в суперклассе Налоговой истории, в Финансовой истории. Когда метод с селектором количество наличных находится, то он выполняется в ответ на сообщение. Ответ на данное сообщение возвращает значение переменной экземпляра количество наличных. Это значение находится в получателе сообщения, в нашем случае в экземпляре Налоговой истории.

Поиск подходящего метода следует по цепи наследования, обрываясь на классе Объект. Если ни одного метода не находится во всех классах цепи наследования, то получателю посылается сообщение не понимаю:; аргумент это не понятое сообщение. Есть метод для селектора не понимаю: в Объекте который сообщает программисту об ошибке.

Предположим мы послали экземпляру Налоговой истории сообщение с селектором потратить:на:. Этот метод находится в суперклассе Финансовая история. Метод как он представлен в третьей главе:

потратить: количество на: причина
   расход от: причина пом: (сам общие траты на: причина) + количество.
   количество наличныхколичество наличных - количество.

Значения премеменых экземпляра (расход и количество наличных) находятся в получателе сообщения, экземпляре Налоговой истории. Псевдо переменная сам тоже используется в этом методе; сам пердставляет экземпляр Налоговой истории который получил сообщение.

Сообщения себеПравить

Когда метод содержит сообщения чьи получатели это сам, то поиск метода для таких сообщений начинается в классе экземпляра не смотря на то в каком классе содержится сам метод. Поэтому, когда предложение сам общие траты на: причина выполняется в методе потратить:на: находящемся в Финансовой истории, то поиск метода связанного с селектором сообщения общие траты на: начинается в классе себя, т.е. в Налоговой истории.

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

имя класса Один

суперкласс Объект

методы экземпляра
тест
   1.

результат 1
   сам тест.


имя класса Два
суперкласс Один
методы экземпляра
тест
   2.

Будет использоваться экземпляр каждого класса для демонстрации нахождения метода для сообщений к себе, пример 1 это экземпляра класса Один а пример 2 это экземпляр класса Два.

   пример 1Один новый.
   пример 2Два новый.

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

4.5.jpg

Рисунок 4.5

Следующая таблица показывает результаты выполнения различных предложений.

предложение результат
пример 1 тест. 1
пример 1 результат 1. 1
пример 2 тест. 2
пример 2 результат 1. 2

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

Сообщения суперуПравить

Дополнительная псевдо переменная именуюмая супер доступна для использования в предложениях метода. Псевдо переменная супер ссылается на получателя сообщения, так же как это делает переменная сам. Однако, когда сообщение посылается суперу, то поиск метода на начинается с класса получателя. Вместо этого поиск начинается в суперклассе класса содержащего метод. Использование супера позволяет методу получить доступ к методу объявленному в суперклассе даже если метод переопределён в подклассе. Использование супера в любом месте отличном от получателья (например как аргумента), ничем не отличается от использования переменной сам; использование супера влияет только на начальный класс с которого начинается поиск метода.

Сообщения суперу будут рассмотрены при помощи ещё двух классов именуемых Три и Четыре. Четыре это подкласс Три, Три это подкласс класса из предыдущего примера Два. Класс Четыре переопределяет метод для сообщения тест. Класс Три содержит метод для двух новых сообщений - результат 2 возвращает результат предложения сам результат 1, и результат 3 возвращает результат предложения супер тест.

имя класса Три

суперкласс Два

методы экземпляра
результат 2
   сам результат 1.

результат 3
   супер тест.


имя класса Четыре

суперкласс Три

методы экземпляра
тест
   4.

Экземпляры классов Один, Два, Три и Четыре могут отвечать на сообщения тест и результат. Ответ экземпляров Три и Четыре на сообщения показывает эффект производимый супером (Рисунок 4.6.).

4.6.jpg

Рисунок 4.6

   пример 3Три новый.
   пример 4Четыре новый.

Попытка послать сообщения результат 2 или результат 3 примеру 1 или примеру 2 вызовет ошибку т.к. экземпляры классов Один или Два не понимают сообщений результат 2 или результат 3.

Следующая таблица показывает результаты посылки различных сообщений.

предложение результат
пример 3 тест. 2
пример 4 результат 1. 4
пример 3 результат 2. 2
пример 4 результат 2. 4
пример 3 результат 3. 2
пример 4 результат 3. 2

Когда примеру 3 посылается тест, то используется метод класса Два, т.к. в классе Три этот метод не переопределён. пример 4 отвечает на результат 4-кой по той же причине почему пример 2 отвечает 2-кой. Когда результат 2 посылается примеру 3, то поиск подходящего метода начинается в классе Три. Найденый здесь метод возвращает результат предложения сам результат. Поиск метода для ответа на сообщение результат также начинается в классе Три. Подходящий метод не находится в классе Три или его суперклассе, Два. Метод для результата находится в классе Один и возвращает результат выполнения предложения сам тест. Поиск для ответа на сообщение тест опять начинается с класса Три. В этот раз соответствующий метод находится в суперклассе Три классе Два.

Эффект посылки сообщения суперу будут проилюстирован при помощи ответов на сообщение результат 3 посланных примеру 3 и примеру 4. Когда результат 3 посылается примеру 3, то поиск соответствующего метода начинается в классе Три. Метод найденный там возвращает результат предложения супер тест. Т.к. тест посылается суперу, то поиск соответствующего метода начинается не в классе Три, а в его суперклассе, Два. Метод тест в классе Два возвращает 2. Когда результат 3 посылается примеру 4, то результат опять 2, не смотря на то что класс Четыре переопределяет сообщение тест.

Данный пример подчёркивает возможную путаницу: супер не начинает поиск в суперклассе получателя, который в данном примере должен быть Три. Сообщение суперу начинает поиск в суперклассе класса содержащего метод в котором используется супер, которым в данном примере является класс Два. Даже если Три переопределяет метод для теста возвращая 3, результат предложения пример 4 результат 3 будет по прежнему 2. Конечно иногда суперкласс класса в котором содержится метод с супером находится в том же суперклассе что и суперкласс получателя.

Другой пример использования супера даёт метод инициализировать баланс: в Налоговой истории.

инициализировать баланс: количество
   супер инициализировать баланс: количество.
   расходы на налоги0.

Этот метод переопределяет метод суперкласса Финансовая история. Метод Налоговой истории содержит два предложения. Первое передаёт управление суперклассу для инициализации баланса.

супер инициализировать баланс: количество.

Псевдо переменная супер ссылается на получателя сообщения, но указывает что поиск метода должен пропустить Налоговую историю и начинать с Финансовой истории. В данном случае предложения из Финансовой истории не будут дублироваться в Налоговой истории. Второе предложение данного метода производит инициализацию особую для класса.

расходы на налоги0.

Если заменить супера на сам в методе инициализировать баланс:, то результатом будет бесконечная рекурсия, т.к. каждый раз при посылке инициализировать баланс: это сообщение будет посылаться ещё раз.

Абстрактные суперклассыПравить

Абстрактные суперклассы создаются когда два класса разделяют часть сових описаний и ни тот ни другой не являются подкассом другого. Многие суперклассы создаются двух классов которые содержат их общии черыт. Такой вид суперклассов называется абстрактным потому что эти классы создаются не для создания экземпляров. В терминах прямоугольников абстрактные суперклассы представляют ситуацию показанную на рисунке 4.7. Заметьте что абстрактный класс не содержит прямых экземпляров.

4.7.jpg

Рисунок 4.7

В качестве примера использования абстрактного суперкласса рассмотри два класса чьи экземпляры представляют словари. Один класс, именуемый Малый словарь, минимизирует место требуемое для хранения своего содержания; другой, именуемый Быстрый словарь, хранить имена и значения редко и использует технику хэширования для нахождения элементов. Оба класса используют два параллельных списка которые содержат имена и связанные с ними значения. Малый словарь помещает имена и значения подряд и использует просто линейный поиск для нахождения имён. Быстрый словарь помещает имена и значения раздельно и использует технику хэширования для нахождения имён. За исключением различий запоминания имён эти два класса очень похожи они реализуют один и тот же протокол и они оба используют параллельные списки для запоминания содержания. Эти подобия представлены в абстрактном суперклассе именуемом Словарь двойной список. Взаимоотношения между этими тремя классами показаны на рисунке 4.8.

4.8.jpg

Рисунок 4.8

Далее показано описание реализации для абстрактного класса Словарь двойной список.

имя класса Словарь двойной список

суперкласс Объект


имена переменных экземпляра имена значения

методы экземпляра
доступ
от: имя
   | номер |
   номерсам номер для: имя.
   номер == 0
      истина: [ сам ошибка: 'Name not found'. ]
      ложь: [ значения от: номер. ].

от: имя пом: значение
   | номер |
   номерсам номер для: имя.
   номер == 0 истина: [ номерсам новый номер для: имя. ].
   значения от: номер пом: значение.

проверки
включает: имя
   (сам номер для: имя) ~= 0.
пустой
   сам размер == 0.
инициализация
инициализировать
   именаРяд новый: 0.
   значенияРяд новый: 0.

Данное описание Словаря двойного списка использует только сообщения определённые в самом Словаре двойном списке или те которые уже описаны в данной или предыдущих главах. Внешний протокол для Словаря двойного списка содержит сообщения от:, от:пом:, включает:, пустой и инициализировать. Новый экземпляр Словаря двойного списка (в действительности экземпляр одного из его подклассов) создаётся посылкой сообщения новый. Затем это сообщение посылает сообщение инициализировать чтобы присвоить значения двум переменных экземпляра. Эти переменные изначально являются пустыми рядами (Ряд новый: 0).

Три сообщения себе используемые в этих методах не реализованы в Словаре двойном списке - размер, номер для: и новый номер для:. Поэтому класс Словарь двойной список называется абстрактным. Если мы создадить экземпляр, то он не сможет правильно отвечать на все сообщения. Два подкласса, Малый словарь и Быстрый словарь должны реализовать эти три недостающих сообщения. Тот факт что поиск всегда начинается в классе экземпляра на который ссылается сам означает что метод в суперклассе может объявлять какое сообщение послать самому, но соответствующий метод находится в подклассе. Таким образом суперкласс может предоставлять каркас для методов которые используются или реализуются в подклассе.

Малый словарь это подкласс Словаря двойного списка который использует минимальный объём памяти для хранения связей, но требует большого времени для нахождения ассоциации. Он предоставляет методы для трёх сообщений которые не были реализованы в Словаре двойном списке - размер, номер для: и новый номер для:. Он не добавляет переменных.

имя класса Малый словарь

суперкласс Словарь двойной список

методы экземпляра
доступ
размер
   имена размер.
личные
номер для: имя
   1
      до: имена размер
      делать: [ :номер | (имена от: номер) == имя истина: [ номер. ]. ].
   0.

новый номер для: имя
   сам расти.
   имена от: имя размер пом: имя.
   имена размер.


расти
   | старые имена старые значения |
   старые именаимена.
   старые значениязначения.
   именаРяд новый: имена размер + 1.
   значенияРяд новый: значения размер + 1.
   имена заменить от: 1 до: старые имена размер с: старые имена.
   значения заменить от: 1 до: старые значения размер с: старые значения.

Т.к. имена запоминаются подряд то размер Малого словаря это размер его ряда имена. Номер конкретного имени определяется при помощи линейного поиска в ряде имён. Если не находится совпадение, то номер это 0, указывает что поиск неудачен. Когда к словарю добавляется новая связь используется метод новый номер для: чтобы найти подходящий номер. Этот класс предполагает что размер рядов имена и значения в точности равен количеству текущих хранимых элементов. Сообщение расти создаёт два Ряда которые копируют предыдущие элементы, которые увеличены на один элемент в конце ряда. В методе для новый номер для: сначала увеличиваются размеры имён и значений и затем новое имя добавляется в новую пустую позицию (в последнюю). Метод который вызывает новый номер для: отвечает за присвоение значения.

Мы может выполнить следующие примеры предложений.

предложение результат
возрастыМалый словарь новый. новый неинициализированный экземпляр
возрасты инициализировать. переменные экземпляра инициализированы
возрасты пустой. истина
возрасты от: 'Brett' пом: 3. 3
возрасты от: 'Dave' пом: 30. 30
возрасты включает: 'Sam'. ложь
возрасты включает: 'Brett'. истина
возрасты размер. 2
возрасты от: 'Dave'. 30

Для каждого вышеприведённого предложения мы показывает в каком классе находится метод и в каком классе ищутся сообщения посылаемые себе.

селектор сообщения сообщения себе класс метода
инициализировать Словарь двойной список
от:пом: Словарь двойной список
номер для: Малый словарь
новый номер для: Малый словарь
включает: Словарь двойной список
номер для: Малый словарь
размер Малый словарь
от: Словарь двойной список
номер для: Малый словарь
ошибка: Объект

Быстрый словарь это другой подкласс Словаря двойного списка. Он использует технику хэширования для размещения имён. Хэширование требует больше памяти, но тратиться меньше времени чем для линейного поиска. Все объекты отвечают на сообщение хэш возвращая число. Числа отвечают на сообщение \\ возвращая значение по модулю аргумента.

имя класса Быстрый словарь

суперкласс Словарь двойной список

методы экземпляра
доступ
размер
   | размер |
   размер0.
   имена делать: [ :имя | имя не пусто истина: [ размерразмер + 1. ]. ].
   размер.
инициализация
инициализировать
   именаРяд новый: 4.
   значенияРяд новый: 4.
личные
номер для: имя
   | номер |
   номеримя хэш \\ имена размер + 1.
   [ (имена от: номер) == имя. ]
      пока ложь: [
         (имена от: номер) это пусто истина: [ 0. ].
         номерномер \\ имена размер + 1. ].
   номер.

новый номер для: имя
   | номер |
   имена размер - сам размер <= (имена размер / 4) истина: [ сам расти. ].
   номеримя хэш \\ имена размер + 1.
   [ (имена от: номер) это пусто. ]
      пока ложь: [ номерномер \\ имена размер + 1. ].
   имена от: номер пом: имя.
   номер.


расти
   | старые имена старые значения |
   старые именаимена.
   старые значениязначения.
   именаРяд новый: имена размер * 2.
   значенияРяд новый: значения размер * 2.
   1
      до: старые имена размер
      делать: [
         :номер |
         (старые имена от: номер) это пусто
            ложь: [
               сам от: (старые имена от: номер) пом: (старые значения от: номер). ]. ].

Быстрый словарь переопределяет реализацию метода инициализировать класса Словарь двойной список чтобы создать Ряды которые уже имееют некоторое выделенное пространство (Ряд новый: 4). Размер Быстрого словаря это не просто размер одной из его переменных т.к. Ряды всегда содержат пустые элементы. Поэтому размер определяется при помощи проверки каждого элемента Ряда и подсчитывается количество не нулевых элементов.

Реализация новый номер для: следует той же идее что используется в Малом словаре за исключением случая когда размер Ряда изменяется (удваивается в случае данного метода расти), каждый элемент явно копируется из старого Ряда в новый поэтому элементы хэшируются заново. Размер не всегда изменяется как в Малом словаре. Размер Быстрого словаря изменяется только когда количество свободной памяти для имён становится меньше минимума. Минимум равен 25 процентам элементов.

имена размер - сам размер <= (имена размер / 4)

Каркасные сообщения для подклассаПравить

Если следовать стилю программирования, метод не должен включать сообщений к себе если сообщения не реализованы классом или наследуемыми от него подклассами. В описании Словаря двойного списка есть три таких сообщения - размер, номер для: и новый номер для:. Как мы увидим в последующих главах возможность отвечать на сообщение размер наследуется от Объекта, ответ это число нумерованных переменных. Подразумевается что подклассы Словаря двойного списка переопределяют этот метод для возвращения количества имён в словаре.

Специальное сообщение, ответственность подкласса, определено в Объекте. Оно используется в реализации сообщений которые не могут быть правильно реализованы в абстрактном классе. Поэтому реализации методов размер номер для: и новый номер для:, по соглашению принятому в Смолтоке, должны состоять из предложения

сам ответственность подкласса.

Ответ на это сообщение это вызов следующего метода определённого в классе Объект.

ответственность подкласса
   сам
      ошибка: 'My subclass should have overridden '
         , этот контекст отправитель селектор цепь для печати.

В данном случае, если метод должен быть реализован в подклассе абстрактного класса, программисту выводится сообщение об ошибке и как её исправить. Более того, используя данное сообщение программист создаёт абстрактный класс в котором все сообщения посылаемые себе реализованы, и в этих реализациях содержится указание какие методы должны быть переопределены в подклассах.

По соглашению, если программист хочет чтобы сообщение унаследованное от абстрактного суперкласса не было реализовано, то подходящий путь для этого переопределить унаследованный метод так

сам не должен реализовывать.

Ответ на это сообщение это вызов следующего метода определённого в классе Объект.

не должен реализовывать
   сам ошибка: 'This message is not appropriate for this object'.

В системе Смолток есть несколько ирархий подклассов которые используют идею создания каркаса сообщений чьи реализации должны быть закончены в подклассах. Эти классы описывают различные виды совокупностей (смотри главы 9 и 10). Классы совокупностей организованный в ирархию для того чтобы разделить как можно большее количество подобных описаний классов совокупностей. Они используют сообщения ответственность подкласса и не должен реализовывать. Другой пример использования подклассов это ирархии одномерных величин и чисел (смотри главы 7 и 8).

Сводка терминологииПравить

подкласс - класс который наследует переменные и методы от существующего класса.

суперкласс - класс от которого наследуются методи и переменные.

Объект - класс являющийся корнем дерева ирархии наследования классов.

переопределение метода - определение метода в подклассе для сообщения уже определённого в суперклассе.

супер - псевдо переменная ссылающаяся на получетел сообщения; отличается от сам способом поиска метода.

абстрактный класс - класс определяющий протокол, но не полностью его реализующий, по соглащению его экземпляры не создаются.

ответственность подкласса - сообщение для указания ошибки, подкласс должен определить одно из сообщений суперкласса.

не должен реализовывать - сообщения для указания ошибки, сообщение наследуется от суперкласса но явно не доступно для экземпляров подкласса.

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики