【发布时间】:2011-03-10 08:41:48
【问题描述】:
我正在尝试在我正在处理的 C# 应用程序中实现撤消/重做堆栈,方法是在调用撤消时将对象恢复到以前的状态。我有一个“Action”类,它看起来基本上是这样的:
class Action
{
object old_state;
object new_state;
public Action(object old)
{
old_state = old;
}
public void finish(object new_obj)
{
new_state = new_obj;
}
public void reverse()
{
new_state = old_state;
}
}
当开始一个可以重做的动作时,会创建一个新动作。当我们到达新状态时,finish() 被调用。当用户想要重做某事时,它会调用 reverse() 并将 Object 恢复到其原始状态。
显然这不起作用,因为两个对象都是通过引用传递的,并且对象只是以新状态结束。
我真正想做的是能够说:
public Action(object old)
{
old_state = old.MemberwiseClone();
}
不幸的是,这不起作用,我收到如下错误:
无法通过“foo.object”类型的限定符访问受保护成员“object.MemberwiseClone()”
我想创建原始状态的浅表副本(按值复制所有值字段,按引用复制所有引用字段),但我不知道如何使用通用对象来做到这一点,相反在我可能希望恢复状态的每个类中实现IClonable。
谁能提供任何见解?
【问题讨论】:
-
我发现这是一篇关于实现撤消/重做操作的好文章。它提供了几种不同的实现方法:codeproject.com/KB/architecture/UndoRedoPart2.aspx