我寫了一些代碼,發現兩個類(即下面的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