Создание экземпляра производного класса из экземпляра родительского класса - PullRequest
2 голосов
/ 24 июня 2011

В общем случае, если для класса A и производного класса DerivedFromA и экземпляра A существует способ создания DerivedFromA из этого экземпляра?

Например, допустим, что DerivedFromA просто переопределяетбольше методов или свойств A. Допустим, у меня есть некоторый класс Container с методом CreateA (), который возвращает экземпляр A, и я либо не могу, либо не хочу переопределять или иным образом связываться с этим классом Container.Я хочу взять экземпляр, возвращенный Container.CreateA (), передать его конструктору DerivedFromA (A instanceOfA) и обработать полученный объект так же, как instanceOfA, и использовать все методы, свойства и данные instanceOfA, кромете, которые я переопределил.

Кстати, речь идет о C #, это имеет значение.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Вам нужно будет создать новый экземпляр DerivedFromA и использовать его вместо исходного. Однако, если вы сделаете это, все будет работать нормально.

Просто добавьте конструктор, как вы показали:

public DerivedFromA(A instanceOfA)
{
    // Copy members from instanceOfA into here as necessary
    this.Foo = instanceOfA.Foo;
    this.Bar = instanceOfA.Bar;

    // Setup unique values
    this.Baz = 42;
}

Затем, когда вы звоните, вы можете просто сделать:

DerivedFromA instance = new DerivedFromA(container.CreateA());
0 голосов
/ 24 июня 2011

Я бы, вероятно, сделал этот новый виртуальный метод примерно таким:

public class ClassA {
    public virtual string Foo { get; set };

    public virtual ClassA GetAsClassA() {
        return this;
    }
}


public class ClassB : ClassA {
    public virtual string Foo { get; set };

    public override ClassA GetAsClassA() {
        // Create new ClassA and copy properties as needed.
        // Can use base.Foo to get base properties, as needed.
    }
}

Это оборачивает логику в сами классы.

...