Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing an interface with partial delegation

I have a subobject who implements only a part of an interface:

  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;

So I have to write TMyTest.P2 as follows:

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

I'm wondering if there is a valid syntax for mapping TMyTest.P2 to FMyTestP2Impl.P2 without writing the implementation for TMyTest.P2. I mean something like the following:

  TMyTest = class(TInterfacedPersistent, IMyTest)
  private
    FMyTestP2Impl : TMyTestP2Impl;
  public
    constructor Create();
    destructor  Destroy(); override;
    procedure P1;
    procedure P2 = FMyTestP2Impl.P2;
  end;
like image 248
Fabrizio Avatar asked Jul 21 '20 10:07

Fabrizio


1 Answers

You have to use 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;
like image 171
Stefan Glienke Avatar answered Oct 18 '22 17:10

Stefan Glienke