2013-02-19 2 views
3

Допустим, у меня есть класс:Продлить объект со значениями от родительского

public class Parent 
{ 
    public string Name { get; set; } 
    public string City { get; set; } 
} 

и в некоторой функции я получаю список типов объектов Родитель, затем я хотел бы расширить эти объекты с новое поле с некоторым значением, поэтому я объявляю расширенный класс как это:

public class Child : Parent 
{ 
    public Child(Parent parent) 
    { 
     Name = parent.Name; 
     City = parent.City; 
    } 
    public int Age { get; set; } 
} 

и вызовите costructor для каждого расширенного объекта. Есть ли лучший способ сделать это? Что делать, если в родителе будет несколько свойств? Может быть, есть еще более элегантный способ добиться этого?

+1

Есть ли причина, по которой вы беспокоитесь о переносе данных из одного класса в другой, вместо того, чтобы идти прямо в «Ребенок» в первую очередь? –

+0

Почему 'Child' расширяет' Parent'? Действительно ли ребенок является родителем? (Очевидно, что это возможно, но в этом контексте это не кажется правильным). Если 'Child' вместо этого имеет свойство« Parent »? –

+1

Мотивация к этому вопросу - это ситуация, когда я получаю список объектов с данными и хочу показывать эти данные, но с некоторыми дополнительными полями, не касаясь базового класса. –

ответ

3

Я думаю, что, может быть, вы ищете копировального-конструктор шаблон. Каждый уровень определяет 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 в определение класса.

2

Не уверен, что, если я тебя обидел, но это может быть более Standar решение

public class Parent 
{ 
    public Parent(string name, string city) 
    { 
     Name = name; 
     City = city; 
    } 

    public string Name { get; set; } 
    public string City { get; set; } 
} 

public class Child : Parent 
{ 
    public Child(string name, string city, int age) : base(name, city) 
    { 
     Age = age; 
    } 
    public int Age { get; set; } 
} 
+0

Это работает, и оно подходит для объектов с относительно небольшим количеством свойств, но оно становится громоздким, когда их многочисленные свойства. –

0

Вы можете сделать это

public class Parent 
{ 
    public string Name { get; set; } 
    public string City { get; set; } 

    public Parent(string name, string city) 
    { 
     this.Name = name; 
     this.City = city; 
    } 

    public Parent():this(string.Empty, string.Empty) 
    { 
    } 
} 

public class Child : Parent 
{ 
    public Child(Parent parent, int age):base(parent.Name, parent.City) 
    { 
     this.Age = age; 
    } 

    public int Age { get; set; } 
} 
+0

Это не копирование и вставка, мы отправляем почти то же самое время. –

Смежные вопросы