close
Orgnization類別繼承ICloneable interface,因此需實作
object Clone();
Lev 2: 小妹
1: class DeepLev2
2: {
3: string name;
4: string level;
5: public string Name { get { return name; } set { name = value; } }
6: public string Level { get { return level; } set { level = value; } }
7: }
Lev 1:特助,使喚Lev 2(小妹)
1: class DeepLev1
2: {
3: string name;
4: string level;
5: DeepLev2 deepLev2;
6: public string Name { get { return name;} set { name = value; } }
7: public string Level { get { return level; }set { level = value; } }
8: public DeepLev1()
9: {
10: deepLev2 = new DeepLev2();
11: }
12: public void SetLev2(string level, string name)
13: {
14: deepLev2.Level = level;
15: deepLev2.Name = name;
16: }
17: public void Disp()
18: {
19: Console.WriteLine("-- Lev {0} {1}", deepLev2.Level, deepLev2.Name);
20: }
21: }
Orgnization: ICloneable
此外,Orgnization物件可使喚deepLev1( Lev 1:特助 )
MemberwiseClone()會自動進行淺複製,但不包含參考類型的資料。
1: class Orgnization : ICloneable
2: {
3: string name;
4: string level;
5: public string Name { get { return name; } set { name = value; } }
6: public string Level { get { return level; } set { level = value; } }
7: private DeepLev1 deepLev1;
8: public Orgnization(string level, string name) { Name = name; Level = level; deepLev1 = new DeepLev1(); }
9: public void SetLev1(string level, string name)
10: {
11: deepLev1.Level = level;
12: deepLev1.Name = name;
13: }
14: public void SetLev2(string level, string name)
15: {
16: deepLev1.SetLev2(level, name);
17: }
18: public void Disp()
19: {
20: Console.WriteLine("- Lev {0} {1}", level, name);
21: Console.WriteLine("-- Lev {0} {1}", deepLev1.Level, deepLev1.Name);
22: deepLev1.Disp();
23: Console.WriteLine("----\n");
24: }
25: public object Clone()
26: {
27: return this.MemberwiseClone();
28: }
29: }
客戶端
1: Orgnization o1 = new Orgnization("0", "董事長");
2: o1.SetLev1("1", "董事長特助");
3: o1.SetLev2("2", "董事長小妹");
4: o1.Disp();
5:
6: Console.WriteLine("=================\n");
7: Orgnization o2 = (Orgnization)o1.Clone();
8: o2.Name = "總經理";
9: o2.SetLev1("1", "總經理特助");
10: o2.SetLev2("2", "總經理小妹");
11:
12: o1.Disp();
13:
14: o2.Disp();
15: Console.ReadLine();
很明顯o2雖然(淺)複製o1,
Orgnization o2 = (Orgnization)o1.Clone();
但o2中Lev1和Lev2參考同一份,
o2.SetLev1("1", "總經理特助");
o2.SetLev2("2", "總經理小妹");
因此o2總經理特助和總經理小妹分別覆蓋了董事長特助和董事長小妹
=============================================================================
版本2: 深複製
1. 讓DeepLev1也繼承ICloneable,DeepLev2不變動
2. Line 19~22: MemberwiseClone();
1: class DeepLev1 : ICloneable
2: {
3: string name;
4: string level;
5: DeepLev2 deepLev2;
6: public string Name { get { return name; } set { name = value; } }
7: public string Level { get { return level; } set { level = value; } }
8: public void SetLev2(string level, string name)
9: {
10: deepLev2 = new DeepLev2();
11: deepLev2.Level = level;
12: deepLev2.Name = name;
13: }
14: public void Disp()
15: {
16: Console.WriteLine("-- Lev {0} {1}", deepLev2.Level, deepLev2.Name);
17: }
18:
19: public object Clone()
20: {
21: return this.MemberwiseClone();
22: }
23: }
3. Line25~28: 新增Orgnization創建子( DeepLev1輸入引數),複製deepLev1物件
4. Line29~36: 深度複製,即創建一個新的Orgnization實體(obj)同時傳入目前deepLev1物件(複製用途,即上一個步驟3)
接著設定Level和Name
1: class Orgnization : ICloneable
2: {
3: string name;
4: string level;
5: public string Name { get { return name; } set { name = value; } }
6: public string Level { get { return level; } set { level = value; } }
7: private DeepLev1 deepLev1;
8: public Orgnization(string level, string name) { Name = name; Level = level; deepLev1 = new DeepLev1(); }
9: public void SetLev1(string level, string name)
10: {
11: deepLev1.Level = level;
12: deepLev1.Name = name;
13: }
14: public void SetLev2(string level, string name)
15: {
16: deepLev1.SetLev2(level, name);
17: }
18: public void Disp()
19: {
20: Console.WriteLine("- Lev {0} {1}", level, name);
21: Console.WriteLine("-- Lev {0} {1}", deepLev1.Level, deepLev1.Name);
22: deepLev1.Disp();
23: Console.WriteLine("----\n");
24: }
25: public Orgnization(DeepLev1 deepLev1)
26: {
27: this.deepLev1 = (DeepLev1)deepLev1.Clone();
28: }
29: public object Clone()
30: {
31: //return this.MemberwiseClone();
32: Orgnization obj = new Orgnization(deepLev1);
33: obj.Level = this.level;
34: obj.Name = this.name;
35: return obj;
36: }
o1董事長特助和董事長小妹
o2總經理特助和總經理小妹
1: Orgnization o1 = new Orgnization("0", "董事長");
2: o1.SetLev1("1", "董事長特助");
3: o1.SetLev2("2", "董事長小妹");
4: o1.Disp();
5:
6: Console.WriteLine("=================\n");
7: Orgnization o2 = (Orgnization)o1.Clone();
8: o2.Name = "總經理";
9: o2.SetLev1("1", "總經理特助");
10: o2.SetLev2("2", "總經理小妹");
11:
12: o1.Disp();
13:
14: o2.Disp();
全站熱搜