У меня есть несколько разных классов, которые я хочу быть клонируемыми: GenericRow
, GenericRows
, ParticularRow
и ParticularRows
. Существует следующая иерархия классов: GenericRow
является родителем ParticularRow
, а GenericRows
является родителем ParticularRows
. Каждый класс реализует ICloneable
, потому что я хочу иметь возможность создавать глубокие копии экземпляров каждого из них. Я считаю себя писать один и тот же код для Clone()
в каждом классе:Сушка реализации ICloneable в нескольких классах
object ICloneable.Clone()
{
object clone;
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
// Serialize this object
formatter.Serialize(stream, this);
stream.Position = 0;
// Deserialize to another object
clone = formatter.Deserialize(stream);
}
return clone;
}
я затем обеспечить удобный метод обертки, например, в GenericRows
:
public GenericRows Clone()
{
return (GenericRows)((ICloneable)this).Clone();
}
Я хорошо с методами удобства обертки ищут примерно то же самое в каждом классе, потому что это очень маленький код, и он делает отличается от класса к классу возвратом типа, литой и т. д. Однако ICloneable.Clone()
идентичен во всех четырех классах. Могу ли я отвлечь это так или иначе, чтобы оно было определено только в одном месте? Мое беспокойство заключалось в том, что если бы я применил какой-либо метод утилит класса/object
, он бы неправильно сделал глубокую копию конкретного экземпляра, который я хочу скопировать. Это хорошая идея?
Добавить 'this' в декларацию параметра' T record', и вам даже не нужен метод Clone в каждом классе (т. Е. Переведите DeepCopyViaBinarySerialization в метод расширения). – dtb
ссылка на аргумент против ICloneable: http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx – drewburlingame