Forstå Delphi Class (og Record) hjelpere

Dataprogrammerere

Getty / PeopleImages.com





En funksjon i Delphi-språket lagt til for noen år siden (helt tilbake i i Delphi 2005 ) kalt 'Klassehjelpere' er designet for å la deg legge til ny funksjonalitet til en eksisterende klasse (eller en post) ved å introdusere nye metoder til klassen (record).

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



Klassehjelper 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 deklarere og implementere en klassehjelper som følgende:



|_+_|

Klassen ovenfor, kalt 'TStringsHelper', er en klassehjelper for TStrings-typen. Merk at TStrings er definert i Classes.pas, en enhet som som standard er tilgjengelig i uses-klausulen for alleDelphiskjemaets enhet, for eksempel.

Funksjonen vi legger til TStrings-typen ved å bruke vår klassehjelper er 'Inneholder'. Implementeringen kan se slik ut:

|_+_|

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

Merk at for eksempel egenskapen Items til enTComboBoxeller en TListBox er av typen TStrings.



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

|_+_|

Klassehjelpere Go og NoGo

Implementeringen av klassehjelpere har noen positive og noen (du kanskje tenker på) negative innvirkninger på kodingen din.



Generelt bør du unngå å utvide dine egne klasser - som om du trenger å legge til ny funksjonalitet til dine egne tilpassede klasser - legg til de nye tingene i klasseimplementeringen direkte - ikke ved å bruke en klassehjelper.

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



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

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-utgivelsen kan du også utvide enkle typer som heltall eller streng eller TDateTime, og ha konstruksjon som:

|_+_|

Jeg vil skrive om Delphi XE 3 enkel type hjelper i nær fremtid.

Hvor er MIN Klassehjelper

En begrensning for å bruke klassehjelpere som kan hjelpe deg å 'skyte deg selv i foten' er det faktum at du kan definere og assosiere flere hjelpere med en enkelt type. Imidlertid gjelder bare null eller én hjelper på et bestemt sted i kildekoden. Hjelperen definert i nærmeste omfang vil gjelde. Klasse- eller journalhjelperomfang bestemmes i normalen Delphi mote (for eksempel fra høyre til venstre i enhetens bruksklausul).

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

Hvis en klassehjelper ikke er definert i enheten der du bruker de introduserte metodene - som i de fleste tilfeller vil være det, vet du ikke hvilken klassehjelperimplementering du faktisk ville brukt. To klassehjelpere for TStrings, navngitt annerledes eller som ligger i forskjellige enheter, kan ha forskjellig implementering for 'Inneholder'-metoden i eksemplet ovenfor.

Bruk eller ikke?

Ja, men vær oppmerksom på mulige bivirkninger.

Her er en annen hendig utvidelse til den ovenfor nevnte TStringsHelper-klassehjelperen

|_+_|

Hvis du har vært det legge til objekter i en strengliste , kan du gjette når du skal bruke den praktiske hjelpeegenskapen ovenfor.