Я думаю, что, может быть, вы ищете копировального-конструктор шаблон. Каждый уровень определяет 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!
выгода от этого в том, что вы можете иметь несколько уровней в с каждым уровнем, управляющим собственными свойствами.
EDIT: Учитывая ваш последний комментарий:
Мотивации к этому вопросу является ситуацией, в которой я получаю список объектов с данными, и хочу, чтобы показать эти данные, но с некоторой дополнительные поля, не касаясь базового класса.
Возможно, лучший способ затем, чтобы обернуть базовый класс:
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;
}
}
Даунсайд это вы должны переопределить каждое свойство, и вы больше не наследуя (не может считаться) "Parent"
, но потом вы окончательно «не трогаете» базовый класс. Можете переместить свойства «Родительский» в интерфейс IParent
, если это вам лучше, но повторное повторение - «касание» базового класса, поскольку вам придется добавить объявление интерфейса IParent
в определение класса.
Есть ли причина, по которой вы беспокоитесь о переносе данных из одного класса в другой, вместо того, чтобы идти прямо в «Ребенок» в первую очередь? –
Почему 'Child' расширяет' Parent'? Действительно ли ребенок является родителем? (Очевидно, что это возможно, но в этом контексте это не кажется правильным). Если 'Child' вместо этого имеет свойство« Parent »? –
Мотивация к этому вопросу - это ситуация, когда я получаю список объектов с данными и хочу показывать эти данные, но с некоторыми дополнительными полями, не касаясь базового класса. –