Forståelse av Delphi Class (og ta opp) hjelpere

En funksjon av Delphi-språket lagt til for noen år siden (langt tilbake i i Delphi 2005) kalt "Class Helpers" er designet for å la deg legge til ny funksjonalitet til en eksisterende klasse (eller en post) ved å introdusere nye metoder for klassen (posten).

Nedenfor ser du noen flere ideer for klassehjelpere + lære når og når du ikke skal bruke klassehjelpere.

Class Helper For...

Med enkle ord er en klassehjelper en konstruksjon som utvider en klasse ved å introdusere nye metoder i hjelperklassen. En klassehjelper lar deg utvide eksisterende klasse uten å faktisk endre den eller arve fra den.

For å utvide VCLs TStrings-klasse vil du erklære og implementere en klassehjelper som følgende:

type
TStringsHelper = klassehjelper for TStrings. offentligfunksjon inneholder (konst aString: streng): boolsk; slutt; 

Ovennevnte klasse, kalt "TStringsHelper", er en klassehjelper for typen TStrings. Merk at TStrings er definert i Classes.pas, en enhet som som standard er tilgjengelig i bruksklausulen for noen Delphi forms enhet, for eksempel.

instagram viewer

Funksjonen vi legger til TStrings-typen ved å bruke klassen hjelperen er "Inneholder". Implementeringen kan se ut som:

funksjon TStringsHelper. inneholder (konst aString: streng): boolsk; begynne
resultat: = -1 <> IndexOf (aString); slutt; 

Jeg er sikker på at du har brukt det ovenstående mange ganger i koden din - for å sjekke om noen etterkommere av TStrings, som TStringList, har noen strengverdi i varesamlingen.

Legg merke til at for eksempel varer-egenskapene til a TComboBox eller en TListBox er av typen TStrings.

Når TStringsHelper er implementert, og en listeboks på et skjema (kalt "ListBox1"), kan du nå sjekke om noen streng er en del av listeboksen Items-egenskapen ved å bruke:

hvis ListBox1.Items. Inneholder ('noen streng') deretter... 

Class Helpers Go og NoGo

Implementeringen av klassehjelpere har noen positive og noen (du kan tenke på) negative effekter på kodingen din.

Generelt bør du unngå å utvide dine egne klasser - som om du trenger å legge til noe ny funksjonalitet til dine egne tilpassede klasser - legg til de nye tingene i klassens implementering direkte - ikke bruker en klasse hjelper.

Klassehjelpere er derfor mer designet for å utvide en klasse når du ikke kan (eller ikke trenger) stole på normal klassearv og implementering av grensesnitt.

En klassehjelper kan ikke deklarere forekomstdata, for eksempel nye private felt (eller egenskaper som vil lese / skrive slike felt). Å legge til nye klassefelt er tillatt.

En klassehjelper kan legge til nye metoder (funksjon, prosedyre).

Før Delphi XE3 kunne du bare utvide klasser og poster - komplekse typer. Fra Delphi XE 3 utgivelse kan du også utvide enkle typer som heltall eller streng eller TDateTime, og ha konstruksjon som:

Var
s: streng; begynne
s: = 'Delphi XE3-hjelpere'; s: = s. Stor bokstav. Omvendt; slutt; 

Jeg skal skrive om hjelper med enkel type Delphi XE 3 i nærmeste fremtid.

Hvor er MY Class Helper

En begrensning i å bruke klassehjelpere som kan hjelpe deg med å "skyte deg selv i foten" er det faktum at du kan definere og knytte flere hjelpere til en enkelt type. Imidlertid gjelder bare null eller en hjelper på et bestemt sted i kildekoden. Hjelperen som er definert i nærmeste omfang, vil gjelde. Hjelpens omfang av klasse eller rekord bestemmes i det normale Delphi mote (for eksempel høyre til venstre i enhetens bruksbestemmelse).

Hva dette betyr er at du kan definere to TStringsHelper-klassehjelpere i to forskjellige enheter, men bare en vil gjelde når den faktisk brukes!

Hvis det ikke er definert en klasseassistent i enheten der du bruker de innførte metodene - som i de fleste tilfeller vil være det, vet du ikke hvilken implementering av klassehjelper du faktisk bruker. To klassehjelpere for TStrings, navngitt på annen måte eller bosatt i forskjellige enheter, kan ha ulik implementering av metoden "Inneholder" i eksemplet ovenfor.

Bruk eller ikke?

Ja, men vær klar over de mulige bivirkningene.

Her er en annen praktisk utvidelse av den ovennevnte TStringsHelper-klassen hjelper


TStringsHelper = klassehjelper for TStrings. privatfunksjon GetTheObject (konst en streng: string): TObject; fremgangsmåte SetTheObject (konst en streng: string; konst Verdi: TObject); offentligeiendom ObjectFor [konst en streng: string]: TObject lese GetTheObject skrive SetTheObject; slutt;... funksjon TStringsHelper. GetTheObject (konst en streng: string): TObject; Var
idx: heltall; begynne
resultat: = null; idx: = IndexOf (aString); hvis idx> -1 deretter resultat: = Objekter [idx]; slutt; fremgangsmåte TStringsHelper. SetTheObject (konst en streng: string; konst Verdi: TObject); Var
idx: heltall; begynne
idx: = IndexOf (aString); hvis idx> -1 deretter Objekter [idx]: = Verdi; slutt; 

Hvis du har vært det legge til objekter i en strengliste, kan du gjette når du skal bruke ovennevnte nyttige hjelperegenskap.

instagram story viewer