2

我使用 Delphi 2006,我有一个名为的复杂类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 的评论,我创建了一个解决方案,例如:(参见http://docwiki.embarcadero.com/RADStudio/XE3/en/Implementing_Interfaces#Implementing_Interfaces_by_Delegation_.28Win32_only.29

    type
      IMyInterface = interface
        procedure P1;
        procedure P2;
      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;
      end;
      TMyClass2 = class(TInterfacedObject, IMyInterface)
        FMyImplClass: TMyImplClass;
        property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
        procedure P3;
        procedure P4;
      end;
    procedure TMyImplClass.P1;
         // ...
    procedure TMyImplClass.P2;
         // ...
    procedure TMyClass1.MyP1;
         // ...
    procedure TMyClass2.P3;
         // ...
    procedure TMyClass2.P4;
         // ...
    var
      MyClass: TMyClass1;
      MyInterface: IMyInterface;
    begin
      MyClass := TMyClass1.Create;
      MyClass.FMyImplClass := TMyImplClass.Create; //Error !!!! FMyImplClass is a read only    property !!!
      MyInterface := MyClass;
      MyInterface.P1;   // calls TMyClass1.MyP1;
      MyInterface.P2;   // calls TImplClass.P2;
    end;

MyClass.FMyImplClass := TMyImplClass.Create;因为我在尝试创建FMyImplClass声明构造函数时遇到错误,TMyClass1TMyClass2不能正常工作。还有其他方法可以创建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;
4

1 回答 1

3

Delphi 没有类似 Scala 的特征或类似 Python 的 mixin,也不支持像 C++ 那样的多重继承。

如果你不能 makeClass1Class2继承 from TMyClassTest,那么也许你必须依赖接口委托TMyClassX不再Interface1直接实现,而是添加一个字段并将它们TMyClassTest委托Interface1给这个字段。

我觉得你最好

  1. 将这些新的常用功能移动到某种Interface0类型
  2. 使Interface1继承自Interface0
  3. 做一些TMyClassesBaseCommonTrait课程,实施Interface0
  4. 创建两个子类TMyClass1InternalEngine(TMyClassesBaseCommonTrait)TMyClass2InternalEngine(TMyClassesBaseCommonTrait)实现(以不同的,特定的方式, APITMyClassX的其余部分Interface1(Interface0)
  5. 具有类型为 doign 实实现TMyClassX的类内部私有字段TMyClass2InternalEngine

谷歌的“delphi interface delegate”将此显示为顶部链接:Delphi:如何将接口实现委托给子对象?

于 2012-12-22T09:59:28.433 回答