11. ICloneable and copy ctor

לעתים המחלקה שלנו מממשת 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(); // Returns shape and not circle!
}
}

שימו לב שיש בעיה עוד יותר גדולה כאשר מחלקת האב היא אבסטרקטית, שהרי לא ניתן לקרוא ל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)
{
// Write clone logic for shape here.
}
#region ICloneable Members
public virtual object Clone()
{
return new Shape(this);
}
#endregion
}
public class Circle : Shape
{
public Circle(Circle source)
: base(source)
{
// Write specific clone logic for circle here.
}
public override object Clone()
{
return new Circle(this);
}
}

יום טוב

שתף