【问题标题】:Implementing an interface with partial delegation使用部分委托实现接口
【发布时间】:2020-11-10 16:29:31
【问题描述】:

我有一个子对象只实现了接口的一部分:

  IMyTest = interface
    procedure P1;
    procedure P2;
  end;

  TMyTestP2Impl = class
    procedure P2;
  end;

  TMyTest = class(TInterfacedPersistent, IMyTest)
  private
    FMyTestP2Impl : TMyTestP2Impl;
  public
    constructor Create();
    destructor  Destroy(); override;
    procedure P1;
    procedure P2;
  end;

所以我必须写TMyTest.P2如下:

procedure TMyTest.P2;
begin
  FMyTestP2Impl.P2();
end;

我想知道是否存在将TMyTest.P2 映射到FMyTestP2Impl.P2 的有效语法,而无需编写TMyTest.P2 的实现。我的意思是这样的:

  TMyTest = class(TInterfacedPersistent, IMyTest)
  private
    FMyTestP2Impl : TMyTestP2Impl;
  public
    constructor Create();
    destructor  Destroy(); override;
    procedure P1;
    procedure P2 = FMyTestP2Impl.P2;
  end;

【问题讨论】:

    标签: delphi interface


    【解决方案1】:

    你必须使用delegation to a class type property:

    type
      IMyTest = interface
        procedure P1;
        procedure P2;
      end;
    
      TMyTestP2Impl = class
        procedure P2;
      end;
    
      TMyTest = class(TInterfacedPersistent, IMyTest)
      private
        FMyTestP2Impl: TMyTestP2Impl;
        property MyTestP2Impl: TMyTestP2Impl read FMyTestP2Impl implements IMyTest;
      public
        constructor Create;
        destructor  Destroy; override;
        procedure P1;
      end;
    

    【讨论】:

    • @KenBourassa,是的,它有效。这就是德尔福的魔力……
    • 天哪,我从来不知道你能做到这一点!
    • @DavidHeffernan 难得的时刻 - 应该有一个徽章;)
    • @KenBourassa 根据 Stefan 链接到的文档:“如果委托属性属于 类类型,则在该类及其祖先中搜索实现指定的方法接口在搜索封闭类及其祖先之前。因此可以在属性指定的类中实现一些方法,而在声明属性的类中实现其他方法." 这就是为什么P2() 可以在另一个类中实现,而该类不必自己实现IMyTest
    • 我多年来一直在使用这种技术,它允许一些简洁的结构。从来没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多