[英]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.