2016-11-25 101 views
1

我有一個自定義類接受同一類的參數C#構造函數

class MyClassA{ 
    public int Width { get; set; } 
} 

和其他自定義B級

class MyClassB { 
    public MyClassA paramClassA; 
    public int Height { get; set; } 
} 

有沒有辦法有內MyClassB一個構造函數,它接受一個參數類型MyClassB並自動爲屬性賦值?

事情是這樣的:

class MyClassB{ 
    public MyClassA paramClassA; 
    public int Height { get; set; } 

    public MyClassB(MyClassB param){ 

    } 

    public MyClassB(MyClassB param){ 
     // automatically assign properties of param to the instance it is created 
    } 
} 

所以我可以這樣做:

var classB = new MyClassB(); 
classB.Height = 100; 
classB.paramClassA = new MyClassA(); 
classB.paramClassA.Width = 100; 

var classB2 = new MyClassB(classB); 

有沒有辦法做到這一點?

+0

只要做到這一點......在你的構造函數中'this.paramClassA = param.paramClassA; this.Height = param.Height;' –

+0

或者你從IClo​​neable繼承 –

回答

1

有沒有內置的方式來做到這一點。無論如何,這是複製構造函數的目的,可以通過將現有實例中的所有屬性複製到當前實例來實現。但是,當你有一個很深的繼承鏈複製所有這些成員可以是非平凡的任務,其中也包括私人成員。

class MyClassB{ 
    public MyClassA paramClassA; 
    public int Height { get; set; } 

    public MyClassB(MyClassB param){ 
     this.Heigth = param.Height; 
     this.MyClassA = param.MyClassA; 
    } 
} 

你也可以實現ICloneable

class MyClassB : ICloneable { 
    public MyClassA paramClassA; 
    public int Height { get; set; } 

    public object Clone(){ 
     return new MyClassB 
     { 
      this.Height; 
      this.MyClassA; 
     }; 
    } 
} 
1

是的,你可以做手工。記住differences between shallow copy and deep copy in C# language

class MyClassB{ 
    public MyClassA paramClassA; 
    public int Height { get; set; } 

    public MyClassB(MyClassB param){ 
     Height = param.Height; 
     paramClassA = new MyClassA(); 
     if (param.paramClassA != null) 
     { 
      paramClassA.Width = param.paramClassA.Width; 
     } 
    } 
} 

我會建議Clone方法MyClassB類中:

class MyClassB{ 
    //.... 

    public MyCLassB Clone() 
    { 
     var result = new MyClassB 
     { 
     Height = Height 
     }; 
     result.paramClassA = new MyClassA(); 
     if (paramClassA != null) 
     { 
     result.paramClassA.Width = paramClassA.Width; 
     } 
    } 
} 

和使用它,象下面這樣:

var classB = new MyClassB(); 
classB.Height = 100; 
classB.paramClassA = new MyClassA(); 
classB.paramClassA.Width = 100; 

var classB2 = classB.Clone(); 
0

你總是可以創建一個副本方法將分配值並返回一個MyClassB,您可以在其中分配值。如果你必須在構造函數中完成以下操作。

public MyClassB(MyClassB param) 
{ 
    Width = param.Width; 
    // If you want to keep the same reference classA 
    paramClassA = param.paramClassA; 
    // if you want the classA to not be the same reference you could always do. 
    paramClassA = new MyClassA() { Width = param.Width }; 
} 
相關問題