Есть ли способ построить дочерний объект из родительской ссылки? - PullRequest
1 голос
/ 19 июля 2011

Учтите, что у меня есть 2 класса:

public class ComplicatedParent
{
    // Lots of data
}

public class SimpleChild : ComplicatedParent
{
    public string SomeAdditionalData { get; set; }

    public SimpleChild(string arg) : base()
    {
        SomeAdditionalData = arg;
    }
}

И SomeFunction, который возвращает экземпляр ComplicatedParent.Есть ли простой способ конструировать дочерний элемент из ссылки родителя, сохраняя состояние родителя?

На самом деле ComplicatedParent class и SomeFunction являются сторонними, поэтому я не могу их изменить.

Ответы [ 5 ]

1 голос
/ 19 июля 2011

Лучший способ сделать это - написать конструктор для SimpleChild, который принимает экземпляр ComplicatedParent в качестве аргумента.Конструктор затем скопирует данные.Вы можете попробовать использовать clone (), чтобы создать копию ComplicatedParent, привести ее к SimpleChild, добавить дополнительные данные и вернуть их.

Для получения справки по клонированию вам может понадобиться гандер по этой ссылке:

Объекты глубокого клонирования

1 голос
/ 19 июля 2011

Вы не можете сделать это автоматически на языке.Вы можете сделать это с помощью Automaper или вручную.

0 голосов
/ 19 июля 2011

Если ComplicatedParent действительно настолько сложен, вы должны рассмотреть его разбиение на более мелкие классы и сохранить экземпляры для них в ComplicatedParent (агрегация, а не наследование).Если эти объекты являются неизменяемыми, реализация construct-from-prototype должна быть легкой.

0 голосов
/ 19 июля 2011

Если вы можете переопределить свойства своего родителя, вы можете взять родительский объект в дочернем конструкторе и делегировать вызовы внутреннему родительскому объекту, на который ссылаются.Это возможно, только если родительские свойства являются виртуальными.

0 голосов
/ 19 июля 2011

Если под «сохранением родительского состояния» вы подразумеваете сохранение, скажем, внутренних значений родительского класса, вы не можете этого сделать, вы должны реализовать его самостоятельно.Что-то вроде:

public static SimpleChildFromParent(ComplicatedParent cp); // static method in SimpleChild class.

//and somewhere in the code 

SimpleChild sc = SimpleChild.SimpleChildFromParent(cp); // where cp is ComplicatedParent previously created and intialized. 

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...