Assistances de classes et d'enregistrements (Delphi)
Remonter à Classes et objets - Index
Cette rubrique décrit la syntaxe des déclarations d'assistances de classes.
Sommaire
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 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
Notez que la fonction d'assistance de classe MyFunc est appelée, car l'assistance de classe est prioritaire sur le type de classe réel.