Я написал несколько кодов и обнаружил, что два класса (а именно, рыба и млекопитающие ниже) имеют один и тот же шаблон, поэтому я решил подытожить дженерики.Должен ли я выполнять ICloneable?
Проблема в том, что мне нужна копия конструктора из базы класс.
Кроме того, это невозможно устранить с помощью ограничений new() (CS0304), поскольку конструкторы не являются стандартными (0-параметрами).
Я пишу это, потому что мне сказали, что реализация ICloneable не является хорошей практикой.
public class OneHeart {...}
public class TwoHeart {...}
public class Animal<TyHeart> /* : ICloneable ?*/ {
public Animal(TyHeart heart) {
if(heart==null) throw new ArgumentNullException();
Heart = heart;
}
public Heart { get; set; }
}
public class Fish : Animal<OneHeart> {
public Fish(OneHeart heart) : base(heart) {}
public Fish(Fish fish) : base(fish.Heart) {} // copy ctor but no use?
}
public class Mammal : Animal<TwoHeart> {
public Mammal(TwoHeart heart, Organ lung) : base(heart) {Lungs=lung;}
public Mammal(Mammal mammal) : base(mammal.Heart) {Lungs=mammal.Lung;}
public Organ Lungs {get; set;} // Mammal-only member:)
}
// The Zoo collects animals of only one type:
public class Zoo<TyHeart, TyAnimal> : LinkedList<TyAnimal>
where TyAnimal : Animal<TyHeart> {
public Zoo() : base() {}
public Zoo(Zoo<TyHeart, TyAnimal> srcZoo) {
foreach(var animal in srcZoo) {
// CS0304 compile error:
base.AddLast(new TyAnimal(animal));
}
}
...
}
рыба и млекопитающие являются только классами, полученных от животных и
Я знаю, они оба реализовать конструкторы копирования.
EDIT: не требуется глубокая копия.
(Типы) Сердца и легкие одноэлементные и распределяются между животными/рыбой/млекопитающими.
Наследуемые классы не должны содержать элементы клонирования, которые не привязаны к 'MemberwiseClone'. В противном случае вызов «Clone» в экземпляре производного класса, который не переопределяет его, приведет к экземпляру неправильного типа. – supercat
@supercat Не так ли в случае со всеми виртуальными методами? Забудьте об интерфейсе ICloneable на мгновение и представьте, что вы реализовали свой собственный механизм клонирования (например, метод копирования). Этот метод, естественно, вернет ссылку на базовый тип. Любой наследник должен будет переопределить его или он не будет работать правильно. Опора на MemberwiseClone не решает проблему глубокого клонирования. –
Если элементы клонирования образуют цепочку, которая возвращается к 'MemberwiseClone' [предпочтительно привязана с использованием защищенного виртуального метода], а производный класс не создает никаких собственных собственных изменяемых объектов, метод клонирования родителя будет работать правильно, чтобы создать экземпляр производного типа. В противном случае * каждый * производный класс должен будет определить переопределение метода клонирования, даже если единственное, что он делает, это цепочка к конструктору копии родителя, и отказ сделать это не приведет к диагностике компилятора - просто поломка. – supercat