代码之家  ›  专栏  ›  技术社区  ›  DRapp

在运行时创建类的派生类型

  •  0
  • DRapp  · 技术社区  · 15 年前

    我试着去理解一些类似的帖子,但是不太理解它们的目的,我想我会解释我自己的…

    我有一个类——用带有属性和方法的代码完全定义。许多方法都是虚拟的,可以被进一步派生的类重写。所以,我有如下的东西

    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 )
    

    因为我在类x中有其他的属性和方法,因为c不能从两个实际类派生,但可以使用接口,但在接口中不能有代码,只能是抽象签名,我该如何执行这种实现。

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   jheddings    15 年前

    你所描述的听起来有点像 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());
    

    此时,您的 类X 实例可以访问 Class_Main 所有派生类的属性和方法。这不意味着 类X 一个聚合,只允许您使用 类主 从内 第X类 (通过 _impl 对象)。

        2
  •  0
  •   James Black    15 年前

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