Forståelse af Delphi Class (og optagelse) hjælpere

click fraud protection

En funktion af Delphi-sproget blev tilføjet for nogle år siden (langt tilbage i i Delphi 2005) kaldet "Class Helpers" er designet til at lade dig tilføje ny funktionalitet til en eksisterende klasse (eller en post) ved at introducere nye metoder til klassen (posten).

Nedenfor kan du se nogle flere ideer til klassehjælpere + lære, hvornår og hvornår man ikke skal bruge klassehjælpere.

Klassehjælper til...

Med enkle ord er en klasseassistent en konstruktion, der udvider en klasse ved at introducere nye metoder i hjælperklassen. En klassehjælper giver dig mulighed for at udvide den eksisterende klasse uden faktisk at ændre den eller arve fra den.

For at udvide VCLs TStrings-klasse ville du erklære og implementere en klassehjælper som følgende:

type
TStringsHelper = klassehjælper til TStrings. offentligfungere Indeholder(const aString: streng): boolsk; ende; 

Ovenstående klasse, kaldet "TStringsHelper", er en klassehjælper til TStrings-typen. Bemærk, at TStrings er defineret i Classes.pas, en enhed, der som standard er tilgængelig i brugsklausulen for enhver

instagram viewer
Delphi formens enhed, for eksempel.

Funktionen, som vi tilføjer til TStrings-typen ved hjælp af vores klassehjælper, er "Indeholder". Implementeringen kunne se ud som:

fungere TStringsHelper. Indeholder(const aString: streng): boolsk; begynde
resultat: = -1 <> IndexOf (aString); ende; 

Jeg er sikker på, at du har brugt ovenstående mange gange i din kode - for at kontrollere, om nogle efterkommere af TStrings, som TStringList, har en vis strengværdi i sin Varesamling.

Bemærk, at f.eks. Egenskaben Items til en TComboBox eller en TListBox er af typen TStrings.

Når TStringsHelper er implementeret, og et listefelt på en formular (kaldet "ListBox1"), kan du nu kontrollere, om nogle strenge er en del af listefeltets egenskaber ved at bruge:

hvis ListBox1.Items. Indeholder ('nogle streng') derefter... 

Class Helpers Go og NoGo

Implementeringen af ​​klassehjælpere har nogle positive og nogle (du måske tænker på) negative effekter på din kodning.

Generelt bør du undgå at udvide dine egne klasser - som om du har brug for at tilføje noget nyt funktionalitet til dine egne tilpassede klasser - tilføj de nye ting i klassens implementering direkte - ikke ved hjælp af en klasse hjælper.

Klassehjælpere er derfor mere designet til at udvide en klasse, når du ikke kan (eller ikke behøver) stole på normal klassearv og interfaceimplementeringer.

En klassehjælper kan ikke erklære forekomstdata som nye private felter (eller egenskaber, der vil læse / skrive sådanne felter). Det er tilladt at tilføje nye klassefelter.

En klassehjælper kan tilføje nye metoder (funktion, procedure).

Før Delphi XE3 kunne du kun udvide klasser og poster - komplekse typer. Fra Delphi XE 3-udgivelse kan du også udvide enkle typer som heltal eller streng eller TDateTime og have konstruktion som:

Var
s: streng; begynde
s: = 'Delphi XE3-hjælpere'; s: = s. Store bogstaver. Baglæns; ende; 

Jeg vil skrive om Delphi XE 3 hjælper af den enkle type i den nærmeste fremtid.

Hvor er MY Class Helper

En begrænsning ved at bruge klassehjælpere, der kan hjælpe dig med at "skyde dig selv i foden", er det faktum, at du kan definere og knytte flere hjælpere til en enkelt type. Dog gælder kun nul eller en hjælper på et bestemt sted i kildekoden. Hjælperen, der er defineret i det nærmeste omfang, gælder. Klasse- eller rekordhjælperomfang bestemmes i det normale Delphi mode (for eksempel højre til venstre i enhedens anvendelsesklausul).

Hvad dette betyder er, at du muligvis definerer to TStringsHelper-klasses hjælpere i to forskellige enheder, men kun en vil anvende, når den faktisk bruges!

Hvis en klassehjælper ikke er defineret i den enhed, hvor du bruger de introducerede metoder - hvilket i de fleste tilfælde vil være det, ved du ikke, hvilken implementering af klassehjælper du faktisk ville bruge. To klassehjælpere til TStrings, navngivet forskelligt eller bosiddende i forskellige enheder, kan have forskellige implementeringer af metoden "Indeholder" i ovenstående eksempel.

Brug eller ikke?

Ja, men vær opmærksom på de mulige bivirkninger.

Her er en anden praktisk udvidelse af ovennævnte TStringsHelper-klasse hjælper


TStringsHelper = klassehjælper til TStrings. privatfungere GetTheObject (const aString: snor): TObject; procedure SetTheObject (const aString: snor; const Værdi: TObject); offentligejendom ObjectFor [const aString: snor]: TObject Læs GetTheObject skrive SetTheObject; ende;... fungere TStringsHelper. GetTheObject (const aString: snor): TObject; Var
idx: heltal; begynde
resultat: = nul; idx: = IndexOf (aString); hvis idx> -1 derefter resultat: = Objekter [idx]; ende; procedure TStringsHelper. SetTheObject (const aString: snor; const Værdi: TObject); Var
idx: heltal; begynde
idx: = IndexOf (aString); hvis idx> -1 derefter Objekter [idx]: = Værdi; ende; 

Hvis du har været det tilføjelse af objekter til en strengliste, kan du gætte, hvornår du skal bruge ovenstående praktiske hjælpeegenskaber.

instagram story viewer