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



我与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的所有方法。我如何避免在两个clases(TMYCLASS1和TMYCLASS2)上实现(例如复制/粘贴)。我不想在三个不同的地方保留相同的代码。

根据阿里奥奇的评论,我创建了一个解决方案,例如:(请参阅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;上有错误,所以我尝试创建FMyImplClassTMyClass1TMyClass2声明构造函数,但不正常。还有一些创建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的混合物,也不支持多个继承a la c 。

如果您不能从TMyClassTest继承Class1Class2,那么也许您必须依靠接口委托:使TMyClassX不再直接实现Interface1,而是添加TMyClassTest的字段并委派他们的字段Interface1到该字段。

我认为你会更好

  1. 将这些新的普通功能移至某些Interface0类型
  2. 使Interface1Interface0继承
  3. 做一些TMyClassesBaseCommonTrait类,实施Interface0
  4. 制作两个子类TMyClass1InternalEngine(TMyClassesBaseCommonTrait)TMyClass2InternalEngine(TMyClassesBaseCommonTrait)实施(以不同的是TMyClassX-特定方式,其余的Interface1(Interface0) API
  5. TMyClassXTMyClass2InternalEngine的内部私人字段类型Doign Real Indemntation

Google的" Delphi接口委托"为顶级链接:Delphi:如何将接口实现到子对象?

最新更新