Ceci est une ancienne révision du document !


Création d'une Class ou d'un Object

Déclaration d'une class

type
  TMyClass = class(TObject)  // TMyClass hérite de TObject
  private
    FSomeVar: integer;
  public
    constructor Create; overload; // overload = plusieurs définition de la même procédure sont disponibles
    constructor Create(Args: array of integer); overload;
    destructor Destroy; override; // override = redefini la méthode virtual du parent.
    procedure DoSomethingLater; virtual; abstract; // Cette méthode n'existe pas ici, elle devra être implémentée dans les enfants de cette class
    procedure DoEvent; virtual;
    function GetSomeVar: integer;
    procedure SetSomeVar(newvalue: integer);
  published
    property SomeVar: integer read GetSomeVar write SetSomeVar default 0;
  end;
 

Les modificateurs

virtual

virtual signifie que la méthode peut être redéfinie/écrasée dans une classe dérivée.

virtual ne peut pas être utilisé avec dynamic et static.

dynamic

dynamic signifie la même chose que virtual.

La différence est que contrairement aux membres virtual dont les adresses sont stockés dans une table,
les membres dynamic n'utilisent pas de tables et n'occupent pas de mémoire vive,
mais leur mécanisme de résolution est plus lent.

dynamic ne peut pas être utilisé avec virtual et static.

static

Une méthode ou une variable static est commune à toutes les instances de la classe ;

Une instance de la classe peut écrire un membre de variable statique et toutes les autres instances conserveront (et liront, en cas d'accès) la nouvelle valeur.

Pour cette raison, le compilateur ne transmet PAS le paramètre self aux méthodes statiques : ce serait un non-sens.

Les méthodes static ne peuvent pas être virtual ou dynamic.

override

Une méthode marquée override cache une méthode virtual ou dynamic.

Une classe dérivée peut implémenter sa propre version d'une méthode virtual,
mais la méthode de base est toujours disponible.

Ceci est également vrai pour les méthodes dynamic.
Cependant, vous ne pouvez pas remplacer une méthode si elle n'est pas virtual ou dynamic.

override peut résoudre l'erreur suivante :

Warning: An inherited method is hidden by “xxxxx;”

Mais si aprés avoir mis override on obtient a nouveau l'erreur :

Error: There is no method in an ancestor class to be overridden: “xxxxx;”

Il faut essayer reintroduce

abstract

Une méthode abstract est déclarée, mais non implémentée dans la classe de base.

Seule les membres virtual peuvent être abstract.

procedure test; virtual; abstract;

Les classes dérivées seront obligées de fournir leur propre implémentation.

overload

Avec la directive sur la overload, vous pouvez déclarer de nombreuses méthodes, fonctions ou procédures sous le même nom mais avec des types et des paramètres différents.

function MultiSum(a, b: integer): integer; overload;
function MultiSum(a, b: AnsiString): AnsiString; overload;

reintroduce

Le modificateur reintroduce appartient à la programmation orientée objet.

Le modificateur reintroduce permet à une méthode de la classe parente d'être masquée par une nouvelle méthode du même nom.
C'est-à-dire qu'une nouvelle méthode existe dans la classe dérivée de la classe parente et dans toutes les autres classes dérivées de celle-ci.
La méthode de la classe parente est préservée et peut toujours être utilisée par celle-ci.

La méthode de la classe parente n'existe plus dans la nouvelle classe, elle a été remplacée par la nouvelle méthode du même nom. La méthode continue d'exister sous sa forme originale dans la classe parente et peut être utilisée par celle-ci.

Cela s'oppose à l'écrasement du modificateur qui ne fonctionne que pour les méthodes virtual.

La réintroduction du modificateur ne fait que supprimer un avertissement indiquant qu'une méthode similaire existe déjà et que le programmeur en est conscient.

interface
 
type
  TParentClass = class
    procedure SetTest(intNum: Integer); 
  end;
 
  TDerivedClass = class(TParentClass)
    procedure SetTest(strName: String); reintroduce; 
    // Cela remplace la méthode de la classe mère dans la classe dérivée. 
    // Et supprime les avertissements qu'une méthode avec une signature identique existe déjà.
  end;
 
implementation
 
procedure TDerivedClass.SetTest(strName: String);
begin
  inherited SetTest(1); // Appel la méthode avec le même nom de la classe de parents, si nécessaire
end;

stdcall

ToDo

Voir aussi

Sources et Ressources

Vous pourriez laisser un commentaire si vous étiez connecté.