Difference between revisions of "How To Use Interfaces"
From Lazarus wiki
Jump to navigationJump to search (Category and code highlighting) |
m (Added another category) |
||
(4 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | Copy the text below and it will demonstrate how to use | + | 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. |
− | + | <syntaxhighlight lang="pascal"> | |
− | < | + | program interfacesygenerics; |
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
Line 74: | Line 74: | ||
end; | end; | ||
{ TRealClass End } | { TRealClass End } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
var | var | ||
Line 108: | Line 89: | ||
//Calling through the interface | //Calling through the interface | ||
if R.GetInterface(STestInterface, I) then | if R.GetInterface(STestInterface, I) then | ||
− | + | begin | |
− | + | Writeln('Got interface OK. Calling it'); | |
− | + | I.DoSomething; | |
− | + | I.DoItAll; | |
− | + | end else | |
− | + | Writeln('Interface not implemented !'); | |
− | + | end. | |
+ | </syntaxhighlight> | ||
+ | == See also == | ||
− | + | *[[Accessing the Interfaces directly]] | |
− | + | *[[Interfaces]] | |
− | + | *[[Understanding Interfaces]] | |
− | |||
− | |||
− | [[Category: | + | [[Category:Pascal]] |
+ | [[Category:Interfaces]] | ||
+ | [[Category:Example programs]] |
Revision as of 02:19, 9 March 2020
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.
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.