ใน C # วิธีใดที่ต้องการเพิ่มฟังก์ชันการคัดลอก (ลึก) ลงในคลาส ควรใช้ตัวสร้างการคัดลอกหรือค่อนข้างมาจาก ICloneable และใช้วิธี Clone ()?
ปัญหาICloneableคือตามที่คนอื่น ๆ กล่าวถึงว่าไม่ได้ระบุว่าเป็นสำเนาลึกหรือตื้นซึ่งทำให้ไม่สามารถใช้งานได้จริงและในทางปฏิบัติแทบไม่ได้ใช้ นอกจากนี้ยังส่งกลับobjectซึ่งเป็นความเจ็บปวดเนื่องจากต้องใช้การหล่อมาก (และแม้ว่าคุณกล่าวถึงเฉพาะการเรียนในคำถามที่ดำเนินการICloneableบนstructต้องมวย.)
ตัวสร้างสำเนายังประสบปัญหาอย่างใดอย่างหนึ่งกับ ICloneable ไม่ชัดเจนว่าตัวสร้างสำเนากำลังทำสำเนาลึกหรือตื้น
Account clonedAccount = new Account(currentAccount); // Deep or shallow?
การสร้างเมธอด DeepClone () จะเป็นการดีที่สุด วิธีนี้เจตนาชัดเจนอย่างสมบูรณ์
สิ่งนี้ทำให้เกิดคำถามว่าควรเป็นวิธีแบบคงที่หรืออินสแตนซ์
Account clonedAccount = currentAccount.DeepClone(); // instance method
หรือ
Account clonedAccount = Account.DeepClone(currentAccount); // static method
ฉันชอบเวอร์ชันคงที่เล็กน้อยในบางครั้งเพียงเพราะการโคลนดูเหมือนเป็นสิ่งที่กำลังทำกับวัตถุมากกว่าสิ่งที่วัตถุกำลังทำ ไม่ว่าในกรณีใดจะมีปัญหาที่ต้องจัดการเมื่อทำการโคลนนิ่งวัตถุที่เป็นส่วนหนึ่งของลำดับชั้นการสืบทอดและวิธีที่ปัญหาเหล่านั้นเกิดขึ้นในท้ายที่สุดอาจผลักดันการออกแบบ
class CheckingAccount : Account
{
CheckAuthorizationScheme checkAuthorizationScheme;
public override Account DeepClone()
{
CheckingAccount clone = new CheckingAccount();
DeepCloneFields(clone);
return clone;
}
protected override void DeepCloneFields(Account clone)
{
base.DeepCloneFields(clone);
((CheckingAccount)clone).checkAuthorizationScheme = this.checkAuthorizationScheme.DeepClone();
}
}