IUndoableActionインターフェイスを使用します。実装では、実行および元に戻す必要のあるデータをすべて保存できます。そうです、スタックを使用してそれらを保持します。
interface IUndoableAction
{
void Do();
void Undo();
}
Stack<IUndoableAction> Actions;
それぞれの種類のアクションは、DoメソッドとUndoメソッドを実装します。
次に、どこかに次の2つの方法があります。
void PerformAction(IUndoableActionaction)
{
Actions.Push(action);
action.Do();
}
void Undo()
{
var action = Actions.Pop();
action.Undo();
}
アクションクラスに何を保存するかについては、一部のアクションは古い値を保存するだけで済みます。ただし、スプレッドシートの2つの行を入れ替えるアクションが発生したことがあります。すべてのセルの値を両方の行に保存しませんでした。元に戻すことができるように、行のインデックスを保存しただけです。すべてのアクションに対してその状態をすべて保存すると、大量のメモリを簡単に埋めることができます。
次に、REDOスタックも必要です。アクションを元に戻すと、そのアクションはREDOスタックにプッシュされます。新しいアクションが実行されるときにREDOスタックをクリアする必要があるため、問題が発生することはありません。