Förstå Delphi Class (och spela in) hjälpare

En del av Delphi-språket som lades till för några år sedan (långt tillbaka in i Delphi 2005) som kallas "Klasshjälpare" är utformad så att du kan lägga till ny funktionalitet i en befintlig klass (eller en post) genom att introducera nya metoder till klassen (posten).

Nedan ser du några fler idéer för klasshjälpare + lära sig när och när man inte ska använda klasshjälpare.

Klass Helper för...

Med enkla ord är en klasshjälper en konstruktion som utökar en klass genom att introducera nya metoder i hjälparklassen. En klasshjälper låter dig utöka befintlig klass utan att faktiskt ändra den eller ärva från den.

För att utvidga VCL: s TStrings-klass skulle du förklara och implementera en klasshjälpare enligt följande:

typ
TStringsHelper = klasshjälper för TStrings. offentligfungera innehåller (const aString: string): boolean; slutet; 

Ovanstående klass, kallad "TStringsHelper" är en klasshjälpare för typen TStrings. Observera att TStrings definieras i Classes.pas, en enhet som som standard finns i användningsklausulen för någon Delphi formens enhet, till exempel.

instagram viewer

Funktionen vi lägger till TStrings-typen med vår klasshjälpare är "Innehåller". Implementeringen kan se ut som:

fungera TStringsHelper. innehåller (const aString: string): boolean; Börja
resultat: = -1 <> IndexOf (aString); slutet; 

Jag är säker på att du har använt ovanstående många gånger i din kod - för att kontrollera om vissa TStrings-ättlingar, som TStringList, har något strängvärde i sin artikelsamling.

Observera att till exempel artiklarnas egendom för a TComboBox eller en TListBox är av typen TStrings.

När TStringsHelper implementeras och en listruta på ett formulär (benämnt "ListBox1") kan du nu kontrollera om någon sträng är en del av listrutan Objektegenskaper genom att använda:

om ListBox1.Items. Innehåller ("någon sträng") sedan... 

Klasshjälpare gå och NoGo

Implementeringen av klassassistenter har vissa positiva och vissa (du kanske tänker på) negativa effekter på din kodning.

I allmänhet bör du undvika att utöka dina egna klasser - som om du behöver lägga till lite ny funktionalitet till dina egna klasser - lägg till de nya sakerna i klassimplementeringen direkt - inte med en klass hjälpare.

Klasshjälpare är därför mer utformade för att utöka en klass när du inte kan (eller inte behöver) lita på normal klassarv och implementering av gränssnitt.

En klasshjälper kan inte deklarera instansdata, som nya privata fält (eller egenskaper som skulle läsa / skriva sådana fält). Lägga till nya klassfält är tillåtet.

En klasshjälpare kan lägga till nya metoder (funktion, procedur).

Innan Delphi XE3 kunde du bara utöka klasser och poster - komplexa typer. Från Delphi XE 3-utgåvan kan du också utöka enkla typer som heltal eller sträng eller TDateTime och ha konstruktioner som:

var
s: sträng; Börja
s: = 'Delphi XE3-hjälpare'; s: = s. Versal. Omvänd; slutet; 

Jag ska skriva om Delphi XE 3 hjälper av enkel typ inom en snar framtid.

Var är MY Class Helper

En begränsning till att använda klasshjälpare som kan hjälpa dig att "skjuta dig själv i foten" är det faktum att du kan definiera och associera flera hjälpare till en enda typ. Emellertid gäller endast noll eller en hjälpare på någon specifik plats i källkoden. Hjälpen som definieras i närmaste omfattning kommer att gälla. Klass eller rekordhjälpare bestäms i normalen Delphi mode (till exempel höger till vänster i enhetens användningsklausul).

Vad detta betyder är att du kan definiera två TStringsHelper-klasshjälpare i två olika enheter, men endast en kommer att tillämpas när den faktiskt används!

Om en klasshjälpare inte definieras i enheten där du använder de introducerade metoderna - vilket i de flesta fall kommer att vara så vet du inte vilken klasshjälperimplementering du faktiskt skulle använda. Två klasshjälpare för TStrings, benämnda annorlunda eller bosatta i olika enheter kan ha olika implementering för metoden "Innehåller" i exemplet ovan.

Använd eller inte?

Ja, men var medveten om de möjliga biverkningarna.

Här är en annan praktisk tillägg till ovan nämnda TStringsHelper-klasshjälpare


TStringsHelper = klasshjälper för TStrings. privatfungera GetTheObject (const aString: sträng): TObject; procedur SetTheObject (const aString: sträng; const Värde: TObject); offentligfast egendom ObjectFor [const aString: sträng]: TObject läsa GetTheObject skriva SetTheObject; slutet;... fungera TStringsHelper. GetTheObject (const aString: sträng): TObject; var
idx: heltal; Börja
resultat: = noll; idx: = IndexOf (aString); om idx> -1 sedan resultat: = Objekt [idx]; slutet; procedur TStringsHelper. SetTheObject (const aString: sträng; const Värde: TObject); var
idx: heltal; Börja
idx: = IndexOf (aString); om idx> -1 sedan Objekt [idx]: = värde; slutet; 

Om du har varit det lägga till objekt i en stränglista, kan du gissa när du ska använda ovanstående praktiska hjälpegenskaper.

instagram story viewer