在运行时创建哪种派生类

时间:2009-11-05 01:55:26

标签: c# inheritance dynamic derived-class

我试图理解一些类似的帖子,但不太了解他们的目的,并且认为我会解释我自己......

我有一个类 - 完全定义了包含属性和方法的代码。许多方法都是虚拟的,可以通过进一步的派生类来覆盖。所以,我有类似下面的内容

Class_Main
  --  Class_A : Class_Main
  --  Class_B : Class_Main
  --  Class_C : Class_Main
  --  Class_D : Class_Main

然后我需要再定义一个可以从A-D动态派生的类......例如:

Class_X : Class_A (or Class_B or Class_C or Class_D )

因为我在Class_X中有其他属性和方法。由于C#不能从两个实际类派生,但可以使用接口,但是你不能在接口中使用代码,只需抽象签名,我该如何进行这样的实现。

由于

2 个答案:

答案 0 :(得分:1)

您所描述的内容听起来有点像duck typing。这在C#中不可用,因为它是一种静态类型的语言。也许当C#4到来时,dynamic会给你你想要的东西。

如果需要使用这些类的功能“填充”Class_X,那么在实例化时将其传递给类是很常见的:

public class Class_X {
    private Class_Main _impl;
    public Class_X(Class_Main impl) {
        _impl = impl;
    }
}

Class_X classXA = new Class_X(new Class_A());
Class_X classXB = new Class_X(new Class_B());

此时,您的Class_X个实例可以访问Class_Main属性&所有派生类的方法。这不会使Class_X成为聚合,只是使您能够使用Class_Main内的任何Class_X(通过_impl对象)的运行时行为。

答案 1 :(得分:0)

从一个类扩展并包含X类中的另一个类,并且只需要适配器方法直接映射到内部类。

所以,现在正好是C#,只是原型设计:

class ClassA {
  public void FunctionClassA(...) { ... }
  public void FunctionClassB(...) { ... }
}

class ClassX : ClassB {
  private ClassA classa;
  public ClassX() {
     classa = new ClassA();
  }
  public void FunctionClassA(...) { classa.FunctionClassA(...); }
}

因此,ClassX现在有一个从ClassA继承的函数(由外观),并包含ClassB的所有方法。