לעתים המחלקה שלנו מממשת ICloneable.בנוסף קיימת מחלקת בת שיורשת המחלקה שלנו.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Shape : ICloneable { #region ICloneable Members public virtual object Clone() { ... } #endregion } public class Circle : Shape { }
|
במקרה זה, היינו רוצים בד"כ לקרוא בפונקציה Clone של האב במחלקה של הבן, אלא שזו מחזירה טיפוס מהסוג של האב!
1 2 3 4 5 6 7
| public class Circle : Shape { public override object Clone() { return base.Clone(); } }
|
שימו לב שיש בעיה עוד יותר גדולה כאשר מחלקת האב היא אבסטרקטית, שהרי לא ניתן לקרוא לbase.
איך בכל זאת ניתן להתגבר על הבעיה?
Copy Constructor to the rescue:
ניצור Copy Ctor במחלקת אב:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class Shape : ICloneable { public Shape(Shape source) { } #region ICloneable Members public virtual object Clone() { return new Shape(this); } #endregion } public class Circle : Shape { public Circle(Circle source) : base(source) { } public override object Clone() { return new Circle(this); } }
|
יום טוב