これはこれまでの回答のコメントとして意図されていましたが、長すぎると思います。
親クラスのインスタンスを取得し、そこからデータをコピーするコンストラクタを持つ子クラスを持つことは、かなり広範な標準です。複数のレベルの継承やその他のクラスでこれが引き起こす可能性のある頭痛を最小限にする方法の1つは、この作業を行う保護された関数を作成することです。この例ではAssignと呼んでいます。私たちには、Person
、Employee
、およびManager
という3つのクラスがあるとします。彼らはそれぞれ順番にもう一方から継承します。
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
protected void Assign(Person otherPerson)
{
Name = otherPerson.Name;
}
}
今、私たちは、従業員を定義します。
public class Employee : Person
{
private int employeeID;
public Employee() { }
public Employee(Person newEmployee) : this()
{
base.Assign(newEmployee);
}
public int EmployeeID
{
get { return employeeID; }
set { employeeID = value; }
}
protected new void Assign(Employee otherEmployee)
{
base.Assign(otherEmployee);
EmployeeID = otherEmployee.EmployeeID;
}
}
その後、我々はマネージャーのための同じ例は次のとおり我々は変更することができるように
public class Manager : Person
{
private string department;
public Manager() { }
public Manager(Employee newManager) : this()
{
base.Assign(newManager);
}
public string Department
{
get { return department; }
set { department = value; }
}
protected new void Assign(Manager otherManager)
{
base.Assign(otherManager);
Department = otherManager.Department;
}
}
ので、各クラスのAssign()
方法はnew
を宣言しました継承クラスには浅いコピー機能を提供するために存在します。
このパターンは、古いオブジェクトと同じデータだけを持つNEWオブジェクトを作成することに注意してください。古いオブジェクトはまだ存在し、既存の参照は新しいオブジェクトを指しません。実際にはオブジェクトのTYPEを変更することはできません。
"this.Field1 = baseInstance.Field1"これは私が避けたいものです。 代わりに、基本クラスをラップし、それをプロパティとして公開します。これはあまり悪くないようです –
その場合、私は継承を全く使用しません。基本クラスのインスタンスを含む新しいクラスを作成します。しかし、Accountオブジェクトを作成するコードにアクセスできる場合は、代わりにAccountXtraオブジェクトを作成するように変更してください。その後、あなたは自由に何でもしたいです。 –