【问题标题】:Creating which derived type of class at runtime在运行时创建类的派生类型
【发布时间】:2010-12-13 06:25:19
【问题描述】:

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

我有一个类——完全用带有属性和方法的代码定义。许多方法是虚拟的,可以被进一步的派生类覆盖。所以,我有类似以下的内容

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# 不能从两个实际的类派生,但可以使用接口,但你不能在接口中有代码,只有抽象签名,我该怎么做这样的实现。

谢谢

【问题讨论】:

  • 你打算如何使用这个范例来实例化对象?

标签: c# inheritance dynamic derived-class


【解决方案1】:

从一个类扩展并在 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 的所有方法。

【讨论】:

    【解决方案2】:

    您所描述的内容听起来有点像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_X 中任何Class_Main 的运行时行为(通过_impl 对象)。

    【讨论】:

    • 这有点像我在想的,但不知道是否还有其他方法......然后我的 class_X 方法会做类似 return _impl.SomeFunction(whateverParam) .. 谢谢
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2012-09-13
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多