Présentation des assistants de classe (et d'enregistrement) Delphi

Une fonctionnalité du langage Delphi ajoutée il y a quelques années (en arrière dans Delphi 2005) appelée "Class Helpers" est conçue pour vous permettre d'ajouter de nouvelles fonctionnalités à une classe existante (ou à un enregistrement) en introduisant de nouvelles méthodes dans la classe (enregistrement).

Vous trouverez ci-dessous quelques idées supplémentaires pour les aides de classe + apprenez quand et quand ne pas utiliser les aides de classe.

Aide de classe pour…

En termes simples, un assistant de classe est une construction qui étend une classe en introduisant de nouvelles méthodes dans la classe d'assistance. Un assistant de classe vous permet d'étendre une classe existante sans la modifier ni en hériter.

Pour étendre la classe TStrings de la VCL, vous devez déclarer et implémenter un assistant de classe comme suit:

 type TStringsHelper = aide de classe pour TStrings Publique une fonction Contient (const aString: string): booléen; fin; 

La classe ci-dessus, appelée "TStringsHelper" est un assistant de classe pour le type TStrings. Notez que TStrings est défini dans Classes.pas, une unité qui est par défaut disponible dans la clause uses pour n'importe quelle unité de formulaire Delphi, par exemple.

La fonction que nous ajoutons au type TStrings à l'aide de notre assistant de classe est "Contient". L'implémentation pourrait ressembler à:

 une fonction TStringsHelper.Contains (const aString: string): booléen; commencer résultat: = -1 IndexOf (aString); fin; 

Je suis certain que vous avez utilisé plusieurs fois ce qui précède dans votre code - pour vérifier si certains descendants de TStrings, comme TStringList, ont une valeur de chaîne dans sa collection Items.

Notez que, par exemple, la propriété Items d'un TComboBox ou d'un TListBox est du type TStrings.

Après avoir implémenté TStringsHelper et une zone de liste sur un formulaire (nommé "ListBox1"), vous pouvez désormais vérifier si une chaîne fait partie de la propriété Items de la zone de liste en utilisant:

 si ListBox1.Items.Contains ('une chaîne') ensuite

Assistants de classe Go et NoGo

L'implémentation des aides de classe a des impacts positifs et certains (vous pourriez penser) négatifs sur votre codage.

En général, vous devez éviter d'étendre vos propres classes - comme si vous devez ajouter de nouvelles fonctionnalités à vos propres classes personnalisées - ajouter directement les nouveaux éléments dans l'implémentation de classe - sans utiliser un assistant de classe.

Les assistants de classe sont donc plus conçus pour étendre une classe lorsque vous ne pouvez pas (ou n'avez pas besoin) de compter sur l'héritage de classe normal et les implémentations d'interface.

Un assistant de classe ne peut pas déclarer des données d'instance, comme de nouveaux champs privés (ou des propriétés qui pourraient lire / écrire de tels champs). L'ajout de nouveaux champs de classe est autorisé.

Un assistant de classe peut ajouter de nouvelles méthodes (fonction, procédure).

Avant Delphi XE3, vous ne pouviez étendre que les classes et les enregistrements - les types complexes. À partir de la version Delphi XE 3, vous pouvez également étendre des types simples comme entier ou chaîne ou TDateTime, et avoir une construction comme:

 var s: chaîne; commencer s: = 'Assistants Delphi XE3'; s: = s.UpperCase.Reverse; fin; 

Je vais écrire sur Delphi XE 3 simple type helper dans un avenir proche.

Où est mon assistant de classe

Une limitation à l'utilisation des assistants de classe qui pourraient vous aider à vous «tirer une balle dans le pied» est le fait que vous pouvez définir et associer plusieurs assistants à un seul type. Toutefois, seul zéro ou un assistant s'applique à un emplacement spécifique du code source. L'assistant défini dans la portée la plus proche s'applique. La portée de l'assistant de classe ou d'enregistrement est déterminée de manière Delphi normale (par exemple, de droite à gauche dans la clause uses de l'unité).

Cela signifie que vous pouvez définir deux assistants de classe TStringsHelper dans deux unités différentes, mais un seul s'appliquera lorsqu'il est réellement utilisé!

Si un assistant de classe n'est pas défini dans l'unité où vous utilisez ses méthodes introduites - ce qui dans la plupart des cas le sera, vous ne savez pas quelle implémentation d'aide de classe vous utiliseriez réellement. Deux assistants de classe pour TStrings, nommés différemment ou résidant dans des unités différentes, peuvent avoir une implémentation différente pour la méthode "Contient" dans l'exemple ci-dessus.

Utiliser ou non?

Oui, mais soyez conscient des effets secondaires possibles.

Voici une autre extension pratique de l'assistant de classe TStringsHelper mentionné ci-dessus

 TStringsHelper = aide de classe pour TStrings privé une fonction GetTheObject (const un string: chaîne): TObject; procédure SetTheObject (const un string: chaîne; const Valeur: TObject); Publique propriété ObjectFor [const un string : chaîne]: TObject lis GetTheObject écrire SetTheObject; fin;… une fonction TStringsHelper.GetTheObject (const un string: chaîne): TObject; var idx: entier; commencer résultat: = néant; idx: = IndexOf (aString); si idx> -1 ensuite résultat: = Objets [idx]; fin; procédure TStringsHelper.SetTheObject (const un string: chaîne; const Valeur: TObject); var idx: entier; commencer idx: = IndexOf (aString); si idx> -1 ensuite Objets [idx]: = valeur; fin; 

Si vous avez ajouté des objets à une liste de chaînes, vous pouvez deviner quand utiliser la propriété d'aide pratique ci-dessus.