Forstå Delphi Class (og Record) hjelpere
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.