从父类的实例创建派生类的实例

时间:2011-06-24 16:36:53

标签: c# derived-class

通常,给定A类和派生类DerivedFromA以及A的实例,有没有办法从该实例构造DerivedFromA?

例如,假设DerivedFromA只是覆盖A的一个或多个方法或属性。假设我有一些带有CreateA()方法的Container类,它返回A的实例,我要么不能,要么不能想要覆盖或以其他方式搞乱那个Container类。我想要做的是获取Container.CreateA()返回的实例,将其传递给DerivedFromA(一个instanceOfA)构造函数,并将结果对象与instanceOfA一样处理,并使用所有instanceOfA的方法,属性和数据,除了我已经覆盖的那些。

顺便说一句,有问题的语言是C#,它会产生影响。

感谢。

2 个答案:

答案 0 :(得分:2)

您必须创建一个新的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());

答案 1 :(得分:0)

我可能会这样做一个新的虚拟方法:

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.
    }
}

这将逻辑包装在类本身中。