En aquest tema, explorarem dos conceptes fonamentals de la Programació Orientada a Objectes (POO) en Delphi/Object Pascal: les interfícies i les classes abstractes. Aquests conceptes són crucials per a la creació de codi modular, reutilitzable i mantenible.

Què és una Interfície?

Una interfície és una col·lecció de definicions de mètodes sense implementació. Les interfícies defineixen un contracte que les classes han de complir. Això permet que diferents classes implementin la mateixa interfície de maneres diferents.

Característiques de les Interfícies:

  • No poden contenir implementacions de mètodes.
  • No poden contenir camps (variables).
  • Les classes que implementen una interfície han de proporcionar implementacions per a tots els mètodes definits en la interfície.

Exemple d'Interfície:

type
  IShape = interface
    ['{8A5B5C3D-4E6F-4A7B-8C9D-0E1F2A3B4C5D}']
    function GetArea: Double;
    function GetPerimeter: Double;
  end;

En aquest exemple, IShape és una interfície que defineix dos mètodes: GetArea i GetPerimeter.

Implementació d'una Interfície:

type
  TRectangle = class(TInterfacedObject, IShape)
  private
    FWidth, FHeight: Double;
  public
    constructor Create(AWidth, AHeight: Double);
    function GetArea: Double;
    function GetPerimeter: Double;
  end;

constructor TRectangle.Create(AWidth, AHeight: Double);
begin
  FWidth := AWidth;
  FHeight := AHeight;
end;

function TRectangle.GetArea: Double;
begin
  Result := FWidth * FHeight;
end;

function TRectangle.GetPerimeter: Double;
begin
  Result := 2 * (FWidth + FHeight);
end;

En aquest exemple, TRectangle implementa la interfície IShape proporcionant les implementacions dels mètodes GetArea i GetPerimeter.

Què és una Classe Abstracta?

Una classe abstracta és una classe que no es pot instanciar directament i que pot contenir mètodes abstractes (sense implementació) i mètodes concrets (amb implementació). Les classes abstractes serveixen com a base per a altres classes.

Característiques de les Classes Abstractes:

  • Pot contenir mètodes abstractes i concrets.
  • No es pot instanciar directament.
  • Les subclasses han de proporcionar implementacions per als mètodes abstractes.

Exemple de Classe Abstracta:

type
  TShape = class abstract
  public
    function GetArea: Double; virtual; abstract;
    function GetPerimeter: Double; virtual; abstract;
  end;

En aquest exemple, TShape és una classe abstracta que defineix dos mètodes abstractes: GetArea i GetPerimeter.

Implementació d'una Classe Abstracta:

type
  TCircle = class(TShape)
  private
    FRadius: Double;
  public
    constructor Create(ARadius: Double);
    function GetArea: Double; override;
    function GetPerimeter: Double; override;
  end;

constructor TCircle.Create(ARadius: Double);
begin
  FRadius := ARadius;
end;

function TCircle.GetArea: Double;
begin
  Result := Pi * FRadius * FRadius;
end;

function TCircle.GetPerimeter: Double;
begin
  Result := 2 * Pi * FRadius;
end;

En aquest exemple, TCircle hereta de TShape i proporciona les implementacions dels mètodes GetArea i GetPerimeter.

Comparació entre Interfícies i Classes Abstractes

Característica Interfícies Classes Abstractes
Implementació de mètodes No
Conté camps No
Herència múltiple No
Instanciació directa No No
Ús principal Definir un contracte Proporcionar una base per a altres classes

Exercicis Pràctics

Exercici 1: Crear una Interfície i Implementar-la

  1. Defineix una interfície IVehicle amb els mètodes StartEngine i StopEngine.
  2. Implementa aquesta interfície en una classe TCar.

Solució:

type
  IVehicle = interface
    ['{D1E2F3A4-B5C6-7D8E-9F0A-1B2C3D4E5F6A}']
    procedure StartEngine;
    procedure StopEngine;
  end;

  TCar = class(TInterfacedObject, IVehicle)
  public
    procedure StartEngine;
    procedure StopEngine;
  end;

procedure TCar.StartEngine;
begin
  WriteLn('Engine started.');
end;

procedure TCar.StopEngine;
begin
  WriteLn('Engine stopped.');
end;

Exercici 2: Crear una Classe Abstracta i Heretar-la

  1. Defineix una classe abstracta TAnimal amb un mètode abstracte MakeSound.
  2. Crea una classe TDog que hereti de TAnimal i implementi el mètode MakeSound.

Solució:

type
  TAnimal = class abstract
  public
    procedure MakeSound; virtual; abstract;
  end;

  TDog = class(TAnimal)
  public
    procedure MakeSound; override;
  end;

procedure TDog.MakeSound;
begin
  WriteLn('Woof!');
end;

Resum

En aquesta secció, hem après sobre les interfícies i les classes abstractes en Delphi/Object Pascal. Les interfícies defineixen un contracte que les classes han de complir, mentre que les classes abstractes proporcionen una base per a altres classes. Hem vist exemples pràctics de com definir i implementar interfícies i classes abstractes, i hem comparat les seves característiques clau. Aquests conceptes són essencials per a la creació de codi modular i reutilitzable en la programació orientada a objectes.

Curs de Programació Delphi/Object Pascal

Mòdul 1: Introducció a Delphi/Object Pascal

Mòdul 2: Estructures de Control i Procediments

Mòdul 3: Treballant amb Dades

Mòdul 4: Programació Orientada a Objectes

Mòdul 5: Funcions Avançades de Delphi

Mòdul 6: Desenvolupament d'Interfícies Gràfiques amb VCL i FMX

Mòdul 7: Desenvolupament Web i Mòbil

Mòdul 8: Millors Pràctiques i Patrons de Disseny

Mòdul 9: Projecte Final

© Copyright 2024. Tots els drets reservats