Présentation des assistants de classe (et d'enregistrement) Delphi introduit une fonctionnalité du langage Delphi vous permettant d'étendre la définition d'une classe ou d'un type d'enregistrement en ajoutant des fonctions et des procédures (méthodes) aux classes et enregistrements existants sans héritage.
Dans la version Delphi XE3, les assistants d'enregistrement sont devenus plus puissants en permettant d'étendre des types Delphi simples tels que des chaînes, des entiers, des énumérations, des ensembles, etc.
Le système. L'unité SysUtils, de Delphi XE3, implémente un enregistrement nommé "TStringHelper" qui est en fait un assistant d'enregistrement pour les chaînes.
En utilisant Delphi XE3, vous pouvez compiler et utiliser le code suivant:
var
s: chaîne; commencer
s: = 'Delphi XE3'; s. Replace ('XE3', 'rules', []). ToUpper; fin;
Pour que cela soit possible, une nouvelle construction a été réalisée dans Delphi "helper d'enregistrement pour [type simple]". Pour les chaînes, il s'agit de "type TStringHelper = helper d'enregistrement pour la chaîne". Le nom indique "record helper" mais il ne s'agit pas d'étendre
enregistrements - plutôt sur l'extension de types simples comme des chaînes, des entiers et similaires.Dans Système et Système. SysUtils il existe d'autres aides d'enregistrement prédéfinies pour les types simples, notamment: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (et quelques autres). Vous pouvez obtenir du nom du type simple que l’assistant étend.
Il existe également des assistants open source pratiques, comme TDateTimeHelper.
Des énumérations? Aide pour les énumérations?
Les énumérations et les ensembles traités comme des types simples peuvent également désormais (dans XE3 et au-delà) être étendus avec des fonctionnalités qu'un type d'enregistrement peut avoir: fonctions, procédures et similaires.
Voici une énumération simple ("TDay") et un assistant d'enregistrement:
type
TDay = (lundi = 0, mardi, mercredi, jeudi, vendredi, samedi, dimanche); TDayHelper = assistant d'enregistrement pour TDay. une fonction AsByte: octet; une fonction ToString: chaîne; fin;
une fonction TDayHelper. AsByte: octet; commencer
résultat: = octet (self); fin; une fonction TDayHelper. ToString: chaîne; commencerCas soi de
Lundi: résultat: = 'Lundi'; Mardi: résultat: = 'mardi'; Mercredi: résultat: = 'Mercredi'; Jeudi: résultat: = 'jeudi'; Vendredi: résultat: = 'Vendredi'; Samedi: résultat: = 'samedi'; Dimanche: résultat: = 'Dimanche'; fin; fin;
var
aDay: TDay; s: chaîne; commencer
aDay: = TDay. Lundi; s: = aDay. ToString. Baisser; fin;
Ensembles? Aide pour les ensembles?
TDays = ensemble de TDay;
var
jours: TDays; s: chaîne; commencer
jours: = [lundi.. Mercredi]; jours: = jours + [dimanche]; fin;
MAIS, à quel point ce serait génial de pouvoir faire:
var
jours: TDays; b: booléen; commencerjours: = [lundi, mardi] b: = jours. Intersection ([lundi, jeudi]). IsEmpty;
type
TDaysHelper = assistant d'enregistrement pour TDays. une fonction Couper(const jours: TDays): TDays; une fonction IsEmpty: booléen; fin;... une fonction TDaysHelper. Couper(const jours: TDays): TDays; commencer
résultat: = self * days; fin; une fonction TDaysHelper. IsEmpty: booléen; commencer
résultat: = self = []; fin;
Pour chaque type d'ensemble construit autour d'une énumération, vous auriez besoin d'un assistant séparé car, malheureusement, les énumérations et les ensembles ne vont pas de pair génériques et types génériques.
Cela signifie que les éléments suivants ne peuvent pas être compilés:
// PAS DE COMPILATION D'ALIKE!
TGenericSet = ensemble de ;
Aide d'enregistrement pour l'ensemble d'octets!
type
TByteSet = ensemble de Octet; TByteSetHelper = assistant d'enregistrement pour TByteSet.
Nous pouvons avoir les éléments suivants dans la définition de TByteSetHelper:
Publiqueprocédure Clair; procédure Comprendre(const valeur: octet); surcharge; en ligne; procédure Comprendre(const valeurs: TByteSet); surcharge; en ligne; procédure Exclure(const valeur: octet); surcharge; en ligne; procédure Exclure(const valeurs: TByteSet); surcharge; en ligne; une fonction Couper(const valeurs: TByteSet): TByteSet; en ligne; une fonction IsEmpty: booléen; en ligne; une fonction Comprend (const valeur: octet): booléen; surcharge; en ligne;une fonction Comprend (const valeurs: TByteSet): booléen; surcharge; en ligne;une fonction IsSuperSet (const valeurs: TByteSet): booléen; en ligne; une fonction IsSubSet (const valeurs: TByteSet): booléen; en ligne; une fonction Équivaut à(const valeurs: TByteSet): booléen; en ligne; une fonction ToString: chaîne; en ligne; fin;
{TByteSetHelper}procédure TByteSetHelper. Inclure (valeur const: octet); commencer
Système. Inclure (auto, valeur); fin; procédure TByteSetHelper. Exclure (valeur const: octet); commencer
Système. Exclure (auto, valeur); fin; procédure TByteSetHelper. Clair; commencer
self: = []; fin; une fonction TByteSetHelper. Égale (valeurs const: TByteSet): booléen; commencer
résultat: = self = valeurs; fin; procédure TByteSetHelper. Exclure (valeurs const: TByteSet); commencer
soi: = valeurs de soi; fin; procédure TByteSetHelper. Inclure (valeurs const: TByteSet); commencer
self: = self + values; fin; une fonction TByteSetHelper. Comprend (valeurs const: TByteSet): booléen; commencer
résultat: = IsSuperSet (valeurs); fin; une fonction TByteSetHelper. Intersection (valeurs const: TByteSet): TByteSet; commencer
résultat: = auto * valeurs; fin; une fonction TByteSetHelper. Comprend (valeur const: octet): booléen; commencer
résultat: = valeur en soi; fin; une fonction TByteSetHelper. IsEmpty: booléen; commencer
résultat: = self = []; fin; une fonction TByteSetHelper. IsSubSet (valeurs const: TByteSet): booléen; commencer
résultat: = self <= valeurs; fin; une fonction TByteSetHelper. IsSuperSet (valeurs const: TByteSet): booléen; commencer
résultat: = self> = values; fin; une fonction TByteSetHelper. ToString: chaîne; var
b: octet; commencerpour b dans soi faire
résultat: = résultat + IntToStr (b) + ','; résultat: = Copier (résultat, 1, -2 + Longueur (résultat)); fin;
var
daysAsByteSet: TByteSet; commencer
daysAsByteSet. Clair; daysAsByteSet. Inclure (lundi. AsByte); daysAsByteSet. Inclure (entier (samedi); daysAsByteSet. Inclure (octet (TDay. Mardi)); daysAsByteSet. Inclure (Entier (TDay. Mercredi)); daysAsByteSet. Inclure (Entier (TDay. Mercredi)); // 2ème fois - pas de sens. daysAsByteSet. Exclure (TDay. Mardi. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([lundi. AsByte, samedi. AsByte]), vrai)); fin;
Il y a un mais :(
Notez que TByteSet accepte les valeurs d'octets - et toute valeur de ce type serait acceptée ici. Le TByteSetHelper tel qu'implémenté ci-dessus n'est pas de type énumération strict (c'est-à-dire que vous pouvez le nourrir avec une valeur non TDay)... mais tant que je suis au courant.. ça marche pour moi.