Способы создания копии элемента в C#
Стоит задача получить копию класса как объект, чтобы при создании двух объектов типа Character, они были как две самостоятельные сущности и не ссылались на одну область памяти.
Допустим, при создании двух Warrior, они были как два самостоятельных объекта со своими полями и методами.
Character Warrior_1
Character Warrior_2
Какие существуют способы реализации такой задачи; или, может, есть какой-то общий способ.
Ответы (1 шт):
Причём здесь наследование? "при создании двух Warrior они были как два самостоятельных объекта со своими полями и методами" - они будут двумя самостоятельными объектами, если вы будете создавать каждый их них с помощью new
. Наследование классов никак не связывает между собой объекты этих классов.
P. S. А, тогда такие варианты:
partial class Warrior : ICloneable {
// 1 интерфейс `ICloneable`
public object Clone() {
return new Warrior() {
ValueTypeProperty1 = this.ValueTypeProperty1,
ReferenceTypeProperty1 = this.ReferenceTypeProperty1.Clone()
}
}
// 2 конструктор копирования
public Warrior(Warrior warrior) {
ArgumentNullException.ThrowIfNull(warrior);
ValueTypeProperty1 = warrior.ValueTypeProperty1;
ReferenceTypeProperty1 = warrior.ReferenceTypeProperty1.Clone();
}
// 3 статический метод копирования
public static Warrior From(Warrior warrior) {
return warrior is null ? null : (Warrior)warrior.Clone();
}
// 4 конструктор с наилучшими параметрами по умолчанию
public Warrior() {
ValueTypeProperty1 = theMostCommonValue;
ReferenceTypeProperty1 = new ReferenceType1(theBestCommonValue);
}
}
Warrior_2 = (Warrior)Warrior_1.Clone(); // 1
Warrior_2 = new Warrior(Warrior_1); // 2
Warrior_2 = Warrior.From(Warrior_1); // 3
Warrior_2 = new Warrior(); // 4
У каждого из вариантов есть свои особенности применения.