コピーコンストラクターのパターンを探しているのではないかと思います。各レベルはprotected
、関連するプロパティをコピーするコンストラクターを定義します。
public class Parent
{
public string Name { get; set; }
public string City { get; set; }
//normal constructor
public Parent()
{
}
protected Parent(Parent copy)
{
this.Name = copy.Name;
this.City = copy.City;
}
}
はChild
から継承しParent
、それをコピーコンストラクタに渡し、必要に応じて新しい値を追加します。
public class Child : Parent
{
public string NewInfo { get; set; }
public Child(Parent copy)
: base(copy)
{
}
}
使用法は次のようになります。
Parent parent = new Parent() { Name = "Name", City = "StackOverflow"};
Child child = new Child(parent) { NewInfo = "Something new!" };
Console.WriteLine(child.Name); //Name
Console.WriteLine(child.City); //StackOverflow
Console.WriteLine(child.NewInfo); //Something new!
これの利点は、各レベルが独自のプロパティを管理する複数のレベルの継承を持つことができることです。
編集:あなたの最新のコメントを考えると:
この質問の動機は、データを含むオブジェクトのリストを取得していて、基本クラスに触れることなく、このデータをいくつかの追加フィールドとともに表示したいという状況です。
おそらく、より良い方法は、基本クラスをラップすることです。
public class Child
{
private readonly Parent WrappedParent;
public string NewInfo { get; set; }
public string Name
{
get { return WrappedParent.Name; }
set { WrappedParent.Name = value; }
}
public string City
{
get { return WrappedParent.City; }
set { WrappedParent.City = value; }
}
public Child(Parent wrappedParent)
{
this.WrappedParent = wrappedParent;
}
}
欠点は、各プロパティを再宣言する必要があり、継承しなくなります(aとは見なされません)"Parent"
が、基本クラスに確実に「触れない」ようになります。「親」プロパティをIParent
インターフェイスに移動する方がよい場合もありますが、IParent
インターフェイス宣言をクラス定義に追加する必要があるため、これを再度行うと、基本クラスに「触れる」ことになります。