Я пытаюсь создать менеджер отмены, который не имеет значения, какой объект вы передаете. Но я не могу понять, как это сделать в C #. Я хотел бы сделать что-то вроде указателя на оригинальный объект и изменить только то место, на которое указывает указатель.
Код C #
public class UndoableObject<T> : IUndoableAction
{
private T UndoObject;
private T ClonedObject;
private readonly string _name;
public string Name
{
get { return _name; }
}
public UndoableObject(ref T ObjectToUndo, string name)
{
_name = name;
UndoObject = ObjectToUndo;
ClonedObject = ObjectExtensions.Copy<T>(ObjectToUndo);
}
public void Redo()
{
T temp = ObjectExtensions.Copy<T>(UndoObject);
UndoObject = ClonedObject;
ClonedObject = temp;
}
public void Undo()
{
T temp = ObjectExtensions.Copy<T>(UndoObject);
UndoObject = ClonedObject;
ClonedObject = temp;
}
}
C ++ реализация того, что я хотел бы случиться
template<typename T>
public class UndoableObject : IUndoableAction
{
private T *UndoObject;
private T *ClonedObject;
private string _name;
public string GetName
{
return _name;
}
public UndoableObject(T *ObjectToUndo, string name)
{
_name = name;
UndoObject = ObjectToUndo;
ClonedObject = &ObjectExtensions.Copy(*ObjectToUndo);
}
public void Redo()
{
T *temp = &ObjectExtensions.Copy(*UndoObject);
delete UndoObject;
UndoObject = ClonedObject;
ClonedObject = temp;
}
public void Undo()
{
T *temp = &ObjectExtensions.Copy(*UndoObject);
delete UndoObject;
UndoObject = ClonedObject;
ClonedObject = temp;
}
}
Я знаю, что в ней, вероятно, есть утечки памяти, но я написал c ++ без компиляции. Надеюсь, у меня был какой-то смысл.
Посмотрите на следующее:
//using System;
//using Sytem.Collections.Generic
public class UndoableObject<T>
{
List<T> _list = new List<T>();
string _name;
int _step = 0;
public UndoableObject(T source, string name)
{
_list.Clear();
_list = new List<T>();
_list.Add(source);
_name = name;
_step = 0;
}
public string GetName
{
get { return _name; }
}
public void Record(T item)
{
_list.Add(item);
_step++;
}
public T Undo()
{
_step--;
if (_step >= 0)
{
return _list[_step];
}
else
{
_step = 0;
return _list[_step];
}
}
public T Redo()
{
_step++;
if (_step < _list.Count)
{
return _list[_step];
}
else
{
_step = _list.Count - 1;
return _list[_step];
}
}
}
Основное использование:
var pictureBox1 = new PictureBox();
var _bitmap = new Bitmap(300, 300);
var uo = new UndoableObject<Bitmap>(_bitmap, "bitmap");
Отменить:
pictureBox1.Image = uo.Undo();
Запись:
uo.Record((Bitmap)pictureBox1.Image);
Повторить:
pictureBox1.Image = uo.Redo();