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

En funktion i Delphi-språket som lades till för några år sedan (långt tillbaka i Delphi 2005) kallat "Klasshjälpare" är utformat för att låta dig 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älpare 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 offentlig fungera innehåller (const aString: string): boolean; slutet; 

Ovanstående klass, kallad "TStringsHelper" är en klasshjälper för typen TStrings. Observera att TStrings är definierade i Classes.pas, en enhet som som standard är tillgänglig i användningsklausulen för en delphi-formulärsenhet, till exempel.

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

 fungera TStringsHelper.Contains (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 egenskapen Items till exempel för en TComboBox eller TListBox är av typen TStrings.

När TStringsHelper är implementerad 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 med hjälp av:

 om ListBox1.Items.Contains ('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 hjälp av en klasshjä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.UpperCase.Reverse; 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älparnas räckvidd bestäms på normalt Delphi-sätt (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 bara 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 privat fungera GetTheObject (const aString: sträng): TObject; procedur SetTheObject (const aString: sträng; const Värde: TObject); offentlig fast 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 lagt till objekt i en stränglista, kan du gissa när du vill använda ovanstående praktiska hjälperegenskap.