簡體   English   中英

接受相同類的參數的C#構造函數

[英]C# constructor that accepts parameter of the same class

我有一個自定義課程

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);

有沒有辦法做到這一點?

沒有內置的方法可以做到這一點。 無論如何,這是復制構造函數的目的,可以通過將所有屬性從現有實例復制到當前實例來實現。 但是,當您擁有深層的繼承鏈時,所有這些成員都是不容易的任務,其中還包括私有成員。

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;
        };
    }
}

是的,您可以手動進行。 記住有關C#語言中淺拷貝和深拷貝之間的區別

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;
        }
    }
}

我將在MyClassB類中推薦Clone方法:

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();

您總是可以創建一個復制方法,該方法將分配值並返回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 };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM