我写了一些代码,发现两个类(即下面的Fish和Mammal)具有相同的模式,所以我决定总结泛型。我应该实施ICloneable吗?
问题是,我需要复制基类类构造函数。
此外,由于构造函数不是默认(0参数),所以无法使用new()约束(CS0304)修复此问题。
我写这个是因为我被告知实施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));
}
}
...
}
鱼类和哺乳动物来自动物性和唯一的类
我知道他们都实现拷贝构造函数。
编辑:没有深层复制需要。
(类型)心脏和肺是单身和动物/鱼/哺乳动物共享。
可继承类不应具有不会链接到MemberwiseClone的克隆成员。否则,在不覆盖它的派生类的实例上调用'Clone'将产生错误类型的实例。 – supercat
@supercat是不是所有虚拟方法的情况?暂时忘掉ICloneable接口,想象您实现了自己的克隆机制(例如Copy方法)。这个方法自然会返回对基类型的引用。任何继承者将不得不重写它,否则它将无法正常工作。依赖MemberwiseClone不能解决深度克隆的问题。 –
如果克隆成员形成可返回到'MemberwiseClone'的链(最好使用受保护的虚拟方法链接),并且派生类不创建任何私有的可变对象,则父类的克隆方法将正确地创建派生类型的实例。否则,每个派生类都必须定义一个克隆方法覆盖,即使它唯一的事情是链接到父代的拷贝构造函数,如果不这样做不会导致编译器诊断 - 只是破坏行为。 – supercat