Assistances de classes et d'enregistrements (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Classes et objets - Index


Cette rubrique décrit la syntaxe des déclarations d'assistances de classes.

A propos des assistances de classes et d'enregistrements

Une assistance de classe ou d'enregistrement est un type qui, lorsqu'il est associé à une autre classe ou un autre enregistrement, introduit des méthodes et propriétés supplémentaires qui peuvent être utilisées dans le contexte du type associé (ou ses descendants). Les assistances permettent d'étendre une classe sans avoir recours à l'héritage, ce qui est aussi utile pour les enregistrements qui n'acceptent pas du tout l'héritage. Une assistance introduit simplement une portée plus large utilisable par le compilateur lors de la résolution des identificateurs. Quand vous déclarez une assistance de classe ou d'enregistrement, vous indiquez son nom, ainsi que le nom du type que vous allez étendre. Vous pouvez utiliser l'assistance partout où vous pouvez légalement utiliser la classe ou l'enregistrement étendu. La portée de résolution du compilateur devient ensuite le type original, plus l'assistance.
Les assistances de classes et d'enregistrements permettent d'étendre un type, mais elles ne doivent pas être considérées comme un outil de conception à utiliser lors du développement d'un nouveau code. Pour du nouveau code, vous devez toujours vous baser sur l'héritage de classe normale et les implémentations d'interfaces.

Syntaxe d'une assistance

Voici la syntaxe de déclaration d'une assistance de classe :
 type
   identifierName = class|record helper [(ancestor list)] for TypeIdentifierName memberList
   end;
Le paramètre ancestor list est facultatif.
Un type d'assistance ne peut ne pas déclarer de données d'instance, mais les champs de classe sont autorisés.
Les règles de portée de visibilité et la syntaxe memberList sont identiques à celles des types de classes et d'enregistrements ordinaires.
Remarque : Les assistances de classes et d'enregistrements ne prennent pas en charge la surcharge d'opérateurs.
Vous pouvez définir et associer plusieurs assistances avec un type unique. Néanmoins, aucune ou une seule assistance est appliquée à un emplacement spécifique du code source. L'assistance définie dans la portée la plus proche sera appliquée. La portée d'une assistance de classe ou d'enregistrement est déterminée dans le mode Delphi normal (par exemple, de droite à gauche dans la clause uses de l'unité).

Utilisation des assistances

Le code suivant illustre la déclaration d'une assistance de classe (les assistances d'enregistrements se comportent de la même manière) :
  
 type
    TMyClass = class
       procedure MyProc;
       function  MyFunc: Integer;
    end;
 
    ...
 
    procedure TMyClass.MyProc;
    var X: Integer;
    begin
       X := MyFunc;
    end;
 
    function TMyClass.MyFunc: Integer;
    begin
        ...
    end;
 
 ...
 
 type
    TMyClassHelper = class helper for TMyClass
      procedure HelloWorld;
      function MyFunc: Integer;
    end;
 
    ...
 
    procedure TMyClassHelper.HelloWorld;
    begin
       Writeln(Self.ClassName); // Self refers to TMyClass type, not TMyClassHelper
    end;
 
    function TMyClassHelper.MyFunc: Integer;
    begin
      ...
    end;
 
 ...
 
 var
   X: TMyClass;
 begin
   X := TMyClass.Create;
   X.MyProc;    // Calls TMyClass.MyProc
   X.HelloWorld; // Calls TMyClassHelper.HelloWorld
   X.MyFunc;    // Calls TMyClassHelper.MyFunc
Modèle:Conseil
Les assistances de classes et d'enregistrements ne fonctionnent pas lorsque les types énumérés/intrinsèques doivent être étendus. Par exemple :
 
type
    TMyEnum = (one, two, three);
    TMyEnumHelper = record helper for TMyEnum
      function GetNext: TMyEnum;
    end;

Voir aussi