Difference between revisions of "How To Use Interfaces"

From Lazarus wiki
Jump to navigationJump to search
Line 2: Line 2:
  
 
>>this is a fully working program
 
>>this is a fully working program
 +
 
No, this code contains memory leaks and incorrect use of interfaces. Please pay attention to this
 
No, this code contains memory leaks and incorrect use of interfaces. Please pay attention to this
  

Revision as of 20:19, 3 October 2021

Copy the text below and it will demonstrate how to use Interfaces to write less code, avoid code repetition,..., this is a fully working program.

>>this is a fully working program

No, this code contains memory leaks and incorrect use of interfaces. Please pay attention to this

program interfacesygenerics;

{$mode objfpc}{$H+}

const
  STestInterface = '{3FB19775-F5FA-464C-B10C-D8137D742088}';

type
  ITestInterface = interface
    [STestInterface]
    procedure DoSomething;
    procedure DoItAll;
  end;

  { Base class Start }
  TBaseObject = class(TInterfacedObject)
    procedure DoAll;
  end;

  procedure TBaseObject.DoAll;
  begin
    Writeln('TBaseObject DoAll !');
  end;
  { Base class End }

type

  { THook Start}
  //Interface implementation on a derived class
  THook = class(TBaseObject, ITestInterface)
    procedure DoSomething;
    //Contrary to what is stated on the FPC reference manual
    //it's now possible to use aliases to indicate
    //interface implementations
    procedure ITestInterface.DoItAll = DoAll;
  end;

  procedure THook.DoSomething;
  begin
    Writeln('THook Doing something !');
  end;
  { THook End}

type

  { TRealClass Start }
  TRealClass = class(TBaseObject, ITestInterface)
  private
    FHook: ITestInterface;
  public
    constructor Create;
    destructor Destroy; override;
    //Here we tell the compiler that our class
    //interface implementation is provided by
    //a member field wich we initialize in this case
    //on the constructor
    property Hook: ITestInterface read FHook implements ITestInterface;
  end;

  constructor TRealClass.Create;
  begin
    //Creating our interface implementor
    FHook := THook.Create;
  end;

  destructor TRealClass.Destroy;
  begin
    //Releasing our interface implementor
    THook(FHook).Free;
    inherited Destroy;
  end;
  { TRealClass End }

var
  R: TRealClass;
  I: ITestInterface;

begin
  Writeln('Using regular interfaces');

  R := TRealClass.Create;

  //callign the interfaced function directly
  R.DoAll;

  //Calling through the interface
  if R.GetInterface(STestInterface, I) then
  begin
    Writeln('Got interface OK. Calling it');
    I.DoSomething;
    I.DoItAll;
  end else
     Writeln('Interface not implemented !');
end.

See also