【发布时间】:2012-10-14 17:31:58
【问题描述】:
我正在尝试重构我拥有的撤消/重做实现,但不确定如何去做。
public class MyObject
{
public int A;
public int B;
public int C;
}
public abstract class UndoRedoAction
{
protected MyObject myobj;
protected int oldValue;
protected int newValue;
public abstract void Undo();
public abstract void Redo();
}
public class UndoRedoActionA : UndoRedoAction
{
UndoRedoActionA(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.A;
newValue = new;
myobj.A = newValue;
}
public override void Undo()
{
myobj.A = oldValue;
}
public override void Redo()
{
myobj.A = newValue;
}
}
public class UndoRedoActionB : UndoRedoAction
{
UndoRedoActionB(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.B;
newValue = new;
myobj.B = newValue;
}
public override void Undo()
{
myobj.B = oldValue;
}
public override void Redo()
{
myobj.B = newValue;
}
}
public class UndoRedoActionC : UndoRedoAction
{
UndoRedoActionC(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.C;
newValue = new;
myobj.C = newValue;
}
public override void Undo()
{
myobj.C = oldValue;
}
public override void Redo()
{
myobj.C = newValue;
}
}
显然,每个 UndoRedoAction 子类在访问不同字段时都具有自定义功能,但它们在这些字段上执行的功能是相同的。是否有任何干净的方法,除了将这些整数转换为属性并传递属性名称(我宁愿不这样做,魔术字符串等),将它们组合成一个通用的 UndoRedoAction 而不是制作一堆所有执行的子类对不同变量的操作完全相同?
我确实考虑过使用可以解决问题的 Memento 模式,但对于这么小的场景来说,这似乎有点矫枉过正,而且我无需担心单向操作,这正是 Memento 模式真正有用的地方。
谢谢。
澄清:这些 UndoRedoAction 对象被放置在一个 Stack
【问题讨论】:
标签: c# inheritance command undo-redo memento