Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Try to understanding Delphi Interfaces

I'm reading the Nick Hodges' book "Coding in Delphi" and I'm trying to understand the interface usage. In a unit I've put asimple interface:

unit INameInterface;

interface

type
  IName = interface
  ['{CE5E1B61-6F44-472B-AE9E-54FF1CAE0D70}']
    function FirstName: string;
    function LastName: string;
  end;

implementation

end.

and in another unit I've put the implementation of this interface, according with the book sample:

unit INameImplementation;

interface

uses
  INameInterface;

type
  TPerson = class(TInterfacedObject, IName)
    protected
      function FirstName: string;
      function LastName: string;
  end;

implementation

{ TPerson }

function TPerson.FirstName: string;
begin
  Result := 'Fred';
end;

function TPerson.LastName: string;
begin
  Result := 'Flinstone';
end;

end.

At this point I've created a simple VCL form application in order to use the object I've created. The form code is this:

unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, INameImplementation;

type
  TfrmMain = class(TForm)
    lblFirtName: TLabel;
    lblLastName: TLabel;
    txtFirstName: TStaticText;
    txtLastName: TStaticText;
    btnGetName: TButton;
    procedure btnGetNameClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Person: TPerson;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  txtFirstName.Caption := '';
  txtLastName.Caption := '';
end;

procedure TfrmMain.btnGetNameClick(Sender: TObject);
begin
  txtFirstName.Caption := ...
end;

end.

My question is this: how can I use the interface? The two funcions are declared as protected so how can I access them from the form? I've to define them as public, or should I use the INameInterface interface unit? I'm terribly confused about interfaces!!!

Eros

like image 908
Eros Avatar asked Jan 30 '15 13:01

Eros


People also ask

What is Delphi interface?

In Delphi, "interface" has two distinct meanings. In OOP jargon, you can think of an interface as a class with no implementation. In Delphi unit definition interface section is used to declare any public sections of code that appear in a unit. This article will explain interfaces from an OOP perspective.

What does it mean to implement an interface?

An Interface is a specification of functionality that a class MUST implement. When you implement an interface, you are specifying to any consumers of your class that you supply the functionality defined in the given Interface.

What is interface and types of interface?

(n.) A boundary across which two independent systems meet and act on or communicate with each other. In computer technology, there are several types of interfaces. user interface – the keyboard, mouse, menus of a computer system. The user interface allows the user to communicate with the operating system.


1 Answers

Essentially there are three things for you to know, beyond what you have already demonstrated understanding.

1. How to call methods of an interface

If you have a reference to an interface, then you can call methods just as you would on a class reference:

var
  Name: IName;
....
Writeln(Name.FirstName);
Writeln(Name.LastName);

2. How to obtain interface references

Typically you do this by instantiating a class that implements the interface you wish to use:

var
  Name: IName;
....
Name := TPerson.Create;
// now you can use Name as before

There are other ways to obtain interface references, but let's leave those to one side for now.

3. How to pass around interfaces

You might not wish to create a new object every time you need to use an interface. So you can get other parties to pass you the interface to use. For instance interfaces can be passed as method parameters:

procedure Foo(Name: IName);
begin
  // use Name as before
end;

You can obtain interface references via function calls and properties, etc.


The two functions are declared as protected so how can I access them from the form?

Well, they are declared protected in the implementing object. But you are not going to access them via the implementing object. You will access them via the interface. Which means that the visibility in the implementing object is not relevant from the perspective of the interface.

Your form unit references INameImplementation which is needed to create the object that implements the interface. You'll also need to use INameInterface so that your code can see the interface itself.

This example isn't very powerful yet because you can still see the implementing object's type. But imagine if that was hidden from you and all you could see was a function that returned an IName. It's when you reach this point that interfaces can achieve their potential.

like image 148
David Heffernan Avatar answered Oct 14 '22 08:10

David Heffernan