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

C# 从父类的实例创建派生类的实例,c#,derived-class,C#,Derived Class,一般来说,给定一个类a、一个派生类DerivedFromA和一个实例a,有没有办法从该实例构造DerivedFromA 例如,假设DerivedFromA只是覆盖了A的一个或多个方法或属性。假设我有一个容器类,它带有一个CreateA()方法,该方法返回A的实例,我不能或不想覆盖或破坏该容器类。我要做的是获取Container.CreateA()返回的实例,将其传递给DerivedFromA(instanceOfA)构造函数,并将生成的对象像instanceOfA一样处理,并使用instance

一般来说,给定一个类a、一个派生类DerivedFromA和一个实例a,有没有办法从该实例构造DerivedFromA

例如,假设DerivedFromA只是覆盖了A的一个或多个方法或属性。假设我有一个容器类,它带有一个CreateA()方法,该方法返回A的实例,我不能或不想覆盖或破坏该容器类。我要做的是获取Container.CreateA()返回的实例,将其传递给DerivedFromA(instanceOfA)构造函数,并将生成的对象像instanceOfA一样处理,并使用instanceOfA的所有方法、属性和数据,但我已重写的方法、属性和数据除外

顺便说一句,所讨论的语言是C#,这会产生不同


谢谢。

您必须从实例派生一个新的
,并使用该实例而不是原始实例。但是,如果你这样做,它会很好地工作

只需添加一个构造函数,如图所示:

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());

我可能会将其作为一种新的虚拟方法,如下所示:

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

这将逻辑封装到类本身中。

我认为您不能直接这样做。然而,你也许可以经常使用类似于修改行为的东西(当我试图写一些复杂的东西时,幸运的是这并不经常),我试图让我的头脑明白一个看似简单而优雅的概念。它似乎应该是一个委托、包装器或适配器模式,但我认为您总是会遇到阻止您的事情。(比如不能重写的方法之类的)。你可能最终“装饰”了比你喜欢的更多的实例,但我认为也许C#中最接近的事情是使用扩展方法……我开始同意Rob的评论——你不能这么做。这个答案是最接近的,但它不是我想要的,因为如果A的结构随后被修改,我必须返回并修改DerivedFromA以反映新的方法、属性等。