使用部分委托实现接口

10

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

  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;
1个回答

15

你必须使用委托到类类型属性

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;

5
@KenBourassa,是的,它有效。这就是Delphi的魔力所在... - Uwe Raabe
5
天啊,我从未想到你能做到这个! - David Heffernan
7
一个罕见的时刻——应该为此发一枚徽章 ;) - Stefan Glienke
3
根据Stefan提供的文档,如果委托属性是一个类类型,则会在该类及其祖先中搜索实现指定接口的方法,然后再搜索封闭类及其祖先。因此,在指定属性的类中实现某些方法,而在声明属性的类中实现其他方法是可能的。这就是为什么P2()可以在另一个类中实现,而该类本身不必实现IMyTest - Remy Lebeau
4
我多年来一直使用这种技术,它可以让我构建出一些很棒的结构。从未遇到过任何问题。 - Uwe Raabe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接