-- Является ли стек (его представление) заполненным?
do
Result := (count = capacity)
end
Компонент
count: INTEGER
Это пример эффективной реализации отложенного компонента как атрибута. Наконец,
put (x: G) is
-- Втолкнуть x на вершину.
require
not full
do
count := count + 1
array_put (x, count)
end
Процедура array_put унаследована от класса
Компоненты |
Класс
Помимо эффективной реализации методов, отложенных (deferred) в классе
array_put (x, count)
Указание на переопределение компонента следует ввести в предложение наследования:
class ARRAYED_STACK [G] inherit
STACK [G]
redefine change_top end
... Остальное, как прежде ...
Инвариант этого класса может иметь вид
invariant
non_negative_count: count >= 0
bounded: count <= capacity
Первое утверждение выражает свойство АТД. Фактически оно присутствует в родительском классе
Сравнив
Структурное наследование
Множественное наследование просто необходимо, когда необходимо задать для класса ряд дополнительных свойств, помимо свойств, заданных базовой абстракцией.
Рассмотрим механизм создания объектов с постоянной структурой (способных сохраняться на долговременных носителях). Поскольку объект является "сохраняемым", то у него должны быть свойства, позволяющие его чтение и запись. В библиотеке Kernel за эти свойства отвечает класс
Без множественного наследования нет способа указать, что некоторая абстракция обладает двумя структурными свойствами - числовыми и сохранения, сравнения и хеширования. Выбор только одного из родителей подобен выбору между отцом и матерью.
Наследование функциональных возможностей
Вот еще одна типичная ситуация. Многие программные инструменты должны сохранять "историю", что позволяет пользователям:
[x]. просмотреть список последних команд;
[x]. вторично выполнить последнюю команду;
[x]. выполнить новую команду, отредактировав для этого предыдущую;
[x]. аннулировать действие последней команды, которая не сумела закончить свою работу.
Такой механизм привлекателен для любой интерактивной среды, однако его создание требует больших усилий. Поэтому историю поддерживают лишь немногие инструменты (к примеру, ряд "командных оболочек" Unix и Windows), да и те нередко частично. Универсальные же решения не зависят от конкретного инструмента. Их можно инкапсулировать в класс, а от него - породить другой класс для управления рабочей сессией любого инструмента. (Решение с применением классов-клиентов допустимо, но не так привлекательно.) И снова без множественного наследования не обойтись, так как недостаточно иметь родителя, знающего только историю.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии