Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用部分委托实现接口_Delphi_Interface - Fatal编程技术网

Delphi 使用部分委托实现接口

Delphi 使用部分委托实现接口,delphi,interface,Delphi,Interface,我有一个子对象,它只实现接口的一部分: IMyTest = interface procedure P1; procedure P2; end; TMyTestP2Impl = class procedure P2; end; TMyTest = class(TInterfacedPersistent, IMyTest) private FMyTestP2Impl : TMyTestP2Impl; public constr

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

  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;
您必须使用:


@肯伯拉萨,是的,它起作用了。这就是德尔福的魔力…天哪,我从来不知道你能做到@大卫·费弗南:这是一个难得的时刻——应该有一个徽章;)@KenBourassa根据Stefan链接的文件:如果委托属性属于类类型,则在搜索封闭类及其祖先之前,将先搜索该类及其祖先以查找实现指定接口的方法。因此,可以在属性指定的类中实现一些方法,在声明属性的类中实现其他方法。”这就是为什么
P2()
可以在另一个类中实现,而该类不必实现
IMyTest
本身。我多年来一直在使用这种技术,它允许一些简洁的构造。从未出现过任何问题。
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;