Как вы назначаете только указатель в C # для моего класса отмены повтора

Я пытаюсь создать менеджер отмены, который не имеет значения, какой объект вы передаете. Но я не могу понять, как это сделать в 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 ++ без компиляции. Надеюсь, у меня был какой-то смысл.

0

Решение

Посмотрите на следующее:

//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();
1

Другие решения


По вопросам рекламы [email protected]