我想也许你正在寻找一种复制构造器模式。每个级别定义一个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
接口声明添加到其类定义中。