Реализация Redo

Реализация Undo

Имея список истории, достаточно просто реализовать Undo:

if on_item then history.item.undo history.backelse message ("Нет команды для отката - undo")end

И снова динамическое связывание играет основную роль. Список истории history является полиморфной структурой данных:


Рис. 3.4.Список истории с различными объектами command

При передвижении курсора влево каждое успешное значение history.item может быть присоединено к объекту любого доступного типа command. Динамическое связывание гарантирует, что в каждом случае history.item.undo автоматически выберет нужную версию undo.

Реализация Redo аналогична:

if not_last then history.forth history.item.redo else message ("Нет команды для отката - undo") end

Предполагается, что в классе COMMAND введена новая процедура redo. До сих пор считалось верным, что redo - это то же самое, что и execute. Это справедливо в большинстве случаев, но для некоторых команд повторное выполнение может отличаться от выполнения с нуля. Лучший способ справиться с такой ситуацией, не жертвуя общностью, - задать для redoповедение по умолчанию в классе COMMAND:

redo is -- Повтор команды, которую можно отменить, -- по умолчанию эквивалентно ее выполнению. do execute end

Наличие реализации превращает класс COMMAND в класс, определяющий поведение (см. лекцию 4 курса "Основы объектно-ориентированного программирования"). Он имеет отложенные процедуры execute и undo и эффективную процедуру redo. Большинство из потомков сохранят поведение по умолчанию redo, но некоторые зададут поведение, соответствующее специфике команды.