Delphi 当一个类已经扩展了一个类和一个接口时,如何继承另一个类

Delphi 当一个类已经扩展了一个类和一个接口时,如何继承另一个类,delphi,oop,class,inheritance,interface,Delphi,Oop,Class,Inheritance,Interface,我使用Delphi2006,我有一个名为TMyClassTest的复杂类,它有许多方法 其中一些方法创建非可视组件,分配这些组件的事件处理程序,并运行这些组件的方法 另外,我有两个类实现相同的接口,如下所示: TMyClass1 = class(Class1, Interface1) ... //procedures from the Interface1 procedure MyClass1Proc1; end; TMyClass2 = class(Class2, Interf

我使用Delphi2006,我有一个名为
TMyClassTest
的复杂类,它有许多方法 其中一些方法创建非可视组件,分配这些组件的事件处理程序,并运行这些组件的方法

另外,我有两个类实现相同的接口,如下所示:

TMyClass1 = class(Class1, Interface1)
   ... //procedures from the Interface1
   procedure MyClass1Proc1;
 end;

TMyClass2 = class(Class2, Interface1)
   ... //procedures from the Interface1
   procedure MyClass2Proc1;
   procedure MyClass2Proc2
 end;
现在我还需要TMyClass1和TMyClass2来“继承”TMyClassTest。 更多。。。Interface1必须包含(超出其方法)MyClassTest中的所有方法。 如何避免在两个类(TMyClass1和TMyClass2)上实现(如复制/粘贴)来自TMyClassTest的所有过程? 我不想在三个不同的地方保留相同的代码

根据Arioch的评论,我创建了如下解决方案: (见附件)

因为我在
MyClass.FMyImplClass:=TMyImplClass.Create处出错
我试图创建
FMyImplClass
TMyClass1
TMyClass2
声明构造函数,但没有正常工作。 是否有其他方法来创建
FMyImplClass

现在我尝试了一个似乎可行的解决方案。会不会有一些隐藏的影响

    type
      IMyInterface = interface
        procedure P1;
        procedure P2;
        procedure CreateFMyImplClass;
      end;
      TMyImplClass = class
        procedure P1;
        procedure P2;
      end;
      TMyClass1 = class(Class1, IMyInterface)
        FMyImplClass: TMyImplClass;
        property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
        procedure IMyInterface.P1 = MyP1;
        procedure MyP1;
        procedure CreateFMyImplClass;
      end;
      TMyClass2 = class(TInterfacedObject, IMyInterface)
        FMyImplClass: TMyImplClass;
        property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
        procedure P3;
        procedure P4;
        procedure CreateFMyImplClass;
      end;
    procedure TMyImplClass.P1;
         // ...
    procedure TMyImplClass.P2;
         // ...
    procedure TMyClass1.MyP1;
         // ...
    procedure TMyClass1.CreateFMyImplClass;
    begin
     FMyImplClass := TMyImplClass.Create;
    end;
    procedure TMyClass2.P3;
         // ...
    procedure TMyClass2.P4;
         // ...
    procedure TMyClass2.CreateFMyImplClass;
    begin
     FMyImplClass := TMyImplClass.Create;
    end;
    var
      MyInterface: IMyInterface;
    begin
      if WantRemote then
         MyInterface := TMyClass1.Create
      else
         MyInterface := TMyClass2.Create;
      MyInterface.CreateFMyImplClass;   // create FMyImplClass ;
      MyInterface.P2;   // calls TImplClass.P2;
    end;

delphi没有鳞片状性状或Python样混配,也不支持多个遗传的L+C++。

如果您不能使
Class1
Class2
继承
TMyClassTest
,那么您可能必须依赖接口委托:使
TMyClassX
不再直接实现
Interface1
,而是为他们添加一个
TMyClassTest
字段,并将他们的
接口1
委托给该字段

我想你最好

  • 将这些新的通用函数移到一些
    接口0
    类型中
  • 使
    Interface1
    继承自
    Interface0
  • 制作一些
    tmyclassebasecommontrait
    类,实现
    interface 0
  • 使两个子类
    TMyClass1InternalEngine(tmyclassebasecommontrait)
    tmyclass2 internalengine(tmyclassebasecommontrait)
    以不同的
    TMyClassX
    特定方式实现
    Interface1(Interface0)
    API的其余部分
  • 拥有
    TMyClassX
    classes内部私有字段的
    TMyClass2InternalEngine
    type doign real implementation

  • Google for“delphi interface delegation”将此显示为顶部链接:

    检查此问题:1)使Class1和Class2继承自TMYClassTest,或2)使TmyClassX不再直接实现Interface1,而是将其添加到TMYClassTest的一个字段中,并将其Interface1委托给此字段。你真倒霉。Delphi不做多重继承。另一方面,继承是一种过度使用和误用的工具。把这当作一个信号,说明组合是一种方式。Class1不是我的类,不能改变它上的任何东西。@sorin为“delphi interface delegation”做谷歌搜索显示了这一顶部链接:我认为你最好将新的通用函数移到某个Interface0类型中,并使Interface1成为Interface0的子类。然后,让一些TMyClasssBaseCommonTrait类实现Interface0,以及两个子类sec TMyClass1InternalEngine(TMyClasssBaseCommonTrait)和tmyclass2 internalengine(TMyClasssBaseCommonTrait)实现(以不同的、TMyClassX特定的方式,实现Interface1(Interface0)的其余部分)API///Delphi没有类似Scala的特性或类似Py的混合
        type
          IMyInterface = interface
            procedure P1;
            procedure P2;
            procedure CreateFMyImplClass;
          end;
          TMyImplClass = class
            procedure P1;
            procedure P2;
          end;
          TMyClass1 = class(Class1, IMyInterface)
            FMyImplClass: TMyImplClass;
            property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
            procedure IMyInterface.P1 = MyP1;
            procedure MyP1;
            procedure CreateFMyImplClass;
          end;
          TMyClass2 = class(TInterfacedObject, IMyInterface)
            FMyImplClass: TMyImplClass;
            property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
            procedure P3;
            procedure P4;
            procedure CreateFMyImplClass;
          end;
        procedure TMyImplClass.P1;
             // ...
        procedure TMyImplClass.P2;
             // ...
        procedure TMyClass1.MyP1;
             // ...
        procedure TMyClass1.CreateFMyImplClass;
        begin
         FMyImplClass := TMyImplClass.Create;
        end;
        procedure TMyClass2.P3;
             // ...
        procedure TMyClass2.P4;
             // ...
        procedure TMyClass2.CreateFMyImplClass;
        begin
         FMyImplClass := TMyImplClass.Create;
        end;
        var
          MyInterface: IMyInterface;
        begin
          if WantRemote then
             MyInterface := TMyClass1.Create
          else
             MyInterface := TMyClass2.Create;
          MyInterface.CreateFMyImplClass;   // create FMyImplClass ;
          MyInterface.P2;   // calls TImplClass.P2;
        end;