2011-06-24 280 views
2

通常,给定类A,派生类DerivedFromA和A的实例,是否有方法从该实例构造DerivedFromA?假设我们说DerivedFromA简单地覆盖了A的一个或多个方法或属性。比方说,我有一个带有CreateA()方法的Container类,它返回A的一个实例,而且我不能或不愿意'您想重写或以其他方式混淆该Container类。我想要做的是取出由Container.CreateA()返回的实例,并将其传递给DerivedFromA(A instanceOfA)构造函数,并将结果对象视为instanceOfA,并使用所有instanceOfA的方法,属性和数据,除了我被覆盖的那些。从父类的实例创建派生类的实例

顺便说一句,有问题的语言是C#,它有所作为。

谢谢。

+0

我不认为你可以直接做到这一点。但是,您可能会使用类似[Castle DynamicProxy](http://www.castleproject.org/)来修改行为 – Rob

+0

每隔一段时间(当我试图写一些复杂的东西时,幸运的是不是经常)我试图让我的头看起来像一个简单而优雅的概念。它似乎应该是一个委托或包装或适配器模式,但我认为你总是遇到阻碍你的事情。 (就像你不能重写的方法或其他东西)。你可能最终会“装饰”比你喜欢的更多的实例,但我想也许C#中最接近的东西是使用扩展方法... – mwardm

回答

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

我开始同意Rob的评论 - 你不能那样做。这个答案是最接近的,但它不是我正在寻找的,因为如果A的结构随后被修改,我必须返回并修改DerivedFromA以反映新的方法,属性等。 –

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

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