| 
| Description |  | The Interface keyword is used in two different ways. 
 Version 1
 
 It starts the definition of external interface of a Unit. Declarations here are externally visible by other units. All of these declarations must be implemented in the Implementation section.
 
 The Uses statement, if present, must be at the start.
 
 Version 2
 
 In Object Oriented programming, we often use Abstract class methods in a base class as a placeholder. All derived classes must implement these methods.
 
 Taking this one step further, an Interface defines a grouping of just abstract properties and methods. It provides a template for a class to use to ensure consistency. It is like a class with only abstract methods. It has the benefits that classes can be based on one parent class, and implement one or more interfaces. It adds a predictable flavour of operation to each class that implements the interface.
 
 Take a look at the Delphi tutorial for more on this complex subject.
 |  |  |  | Notes |  | When implementing an interface, you must implement QueryInterface, _AddRef and _Release standard interface methods, unless you base your class on one that already has these implemented, such as TInterfacedObject. 
 |  |  |  | Related commands |  | 
| Abstract |  | Defines a class method only implemented in subclasses |  
| Class |  | Starts the declaration of a type of object class |  
| Constructor |  | Defines the method used to create an object from a class |  
| Destructor |  | Defines the method used to destroy an object |  
| Function |  | Defines a subroutine that returns a value |  
| Implementation |  | Starts the implementation (code) section of a Unit |  
| Object |  | Allows a subroutine data type to refer to an object method |  
| Procedure |  | Defines a subroutine that does not return a value |  
| TObject |  | The base class type that is ancestor to all other classes |  
| Unit |  | Defines the start of a unit file - a Delphi module |  
| Uses |  | Declares a list of Units to be imported |  |  |  | 
| Example code : Creating a car class from a vehicle interface |  | // Full Unit code. // -----------------------------------------------------------
 // You must store this code in a unit called Unit1 with a form
 // called Form1 that has an OnCreate event called FormCreate.
 
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
 
 type
 // An interface definition
 IVehicle = Interface(IInterface)
 // Properties and their functions
 function GetAge   : Integer;
 function GetMiles : Integer;
 property age   : Integer read GetAge;
 property miles : Integer read GetMiles;
 
 // Non-property function
 function GetValue : Currency;
 end;
 
 // Implement this interface in a car class
 // Note that TInterfaceObject defines QueryInterface, _AddRef
 // _AddRef functions for us
 TCar = Class(TInterfacedObject, IVehicle)
 private
 fAge, fMiles : Integer;
 fCarType : string;
 function GetAge   : Integer;
 function GetMiles : Integer;
 public
 property age     : Integer read GetAge;
 property miles   : Integer read GetMiles;
 property carType : string  read fCarType;
 
 // Non-property function
 function GetValue : Currency;
 published
 constructor Create(age, miles : Integer; carType : string);
 end;
 
 // The form class itself
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 // Car constructor
 constructor TCar.Create(age, miles: Integer; carType: string);
 begin
 // Save parameters
 fAge     := age;
 fMiles   := miles;
 fCarType := carType;
 end;
 
 // Get the age of the car
 function TCar.GetAge: Integer;
 begin
 Result := fAge;
 end;
 
 // Get the mileage of the car
 function TCar.GetMiles: Integer;
 begin
 Result := fMiles;
 end;
 
 // Calculate the car value
 function TCar.GetValue: Currency;
 begin
 Result := 10000.0 - ((age * miles)/10.0);
 end;
 
 // Main line code
 procedure TForm1.FormCreate(Sender: TObject);
 var
 car : TCar;
 begin
 // Create a car!
 car := TCar.Create(1, 2076, 'Honda Jazz');
 
 // Show the current value of this car
 ShowMessageFmt('My %s car is %d years old, %d miles, value %m',
 [car.carType, car.age, car.miles, car.GetValue]);
 end;
 
 end.
 
 |  
 | My Honda Jazz car is 1 years old, 2076 miles, value ?9,792.40 
 |  |