【问题标题】:Multiple inheritance for interfaces接口的多重继承
【发布时间】:2017-03-24 14:43:07
【问题描述】:

有没有办法定义继承自两个或多个接口的接口?

我在Delphi2007上试过如下代码:

  IInterfaceA = interface
     procedure A;
  end;

  IInterfaceB = interface
    procedure B;
  end;

  IInterfaceAB = interface(IInterfaceA, IInterfaceB);

.. 它引发了 E2029 错误:

E2029 ')' 预期但 ',' 找到

在线:

IInterfaceAB = interface(IInterfaceA, IInterfaceB).

【问题讨论】:

标签: delphi inheritance interface multiple-inheritance


【解决方案1】:

Delphi 中没有多重接口继承,因为 Delphi 中根本没有多重继承。你所能做的就是让一个类一次实现多个接口。

TMyClass = class(TInterfacedObject, IInterfaceA, IInterfaceB)

【讨论】:

    【解决方案2】:

    在Delphi中接口不能继承多个接口,但是类可以实现多个接口。如果您正确设计组件(查找 ISP - 接口隔离原则),您应该不需要从接口继承接口。

    【讨论】:

      【解决方案3】:

      恕我直言,在这种情况下,您必须定义三种类型。 每个接口一个,第三个用于多重继承:

        IInterfaceA = interface
           procedure A;
        end;
      
        IInterfaceB = interface
          procedure B;
        end;
      
        TiA = class(TInterfacedObject, IInterfaceA)
          procedure A;
        end;
      
        TiB = class(TInterfacedObject, IInterfaceB)
          procedure B;
        end;
      
        TMyObject = class(TInterfacedObject, IInterfaceA, IInterfaceB)
        private
          _iA : IInterfaceA;
          _iB : IInterfaceB;
          function getiA : IInterfaceA;
          function getiB : IInterfaceB;
        public
          property iA : IInterfaceA read getiA implements IInterfaceA;
          property iB : IInterfaceB read getiB implements IInterfaceB;
        end;
      {.....}
      { TMyObject }
      
      function TMyObject.getiA: IInterfaceA;
      begin
        if not Assigned(_iA) then _iA := TIA.Create;
        Result := _iA;
      end;
      
      function TMyObject.getiB: IInterfaceB;
      begin
        if not Assigned(_iB) then _iB := TIB.Create;
        Result := _iB;
      end;
      

      【讨论】:

      • 虽然这是一种可能的方法,但实际上并不是必需的。您也可以直接在 TMyObject 中实现过程 A 和 B。
      • 是的,当然可以,但是使用这种方法,最容易修改每个接口的实现。无需修改使用层的实现。这避免了对更复杂项目的边缘效应
      猜你喜欢
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      • 2021-06-23
      • 2012-12-07
      相关资源
      最近更新 更多