У меня есть несколько разных классов, которые я хочу клонировать: GenericRow
, GenericRows
, ParticularRow
и ParticularRows
. Существует следующая иерархия классов: GenericRow
является родителем ParticularRow
, а GenericRows
является родителем ParticularRows
. Каждый класс реализует ICloneable
, потому что я хочу иметь возможность создавать глубокие копии экземпляров каждого. Я пишу один и тот же код для Clone()
в каждом классе:
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
, он не смог бы правильно сделать глубокую копию конкретного экземпляра, который я хочу скопировать. В любом случае, это хорошая идея?