close

Orgnization類別繼承ICloneable interface,因此需實作

object Clone();

 

image

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總經理特助和總經理小妹分別覆蓋了董事長特助和董事長小妹

image

=============================================================================

版本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總經理特助和總經理小妹

image

   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();
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()