Forståelse af Delphi Class (og optagelse) hjælpere introducerer en funktion på Delphi-sproget, så du kan udvide definitionen af en klasse eller en posttype ved at tilføje funktioner og procedurer (metoder) til eksisterende klasser og poster uden arv.
I XE3 Delphi-version blev record-hjælpere mere kraftfulde ved at give mulighed for at udvide enkle Delphi-typer som strenge, heltal, enums, sæt og ens.
Systemet. SysUtils-enheden fra Delphi XE3 implementerer en post kaldet "TStringHelper", som faktisk er en rekordhjælper til strenge.
Ved hjælp af Delphi XE3 kan du kompilere og bruge den næste kode:
Var
s: streng; begynde
s: = 'Delphi XE3'; s. Erstat ('XE3', 'regler', []). ToUpper; ende;
For at dette skulle være muligt, blev der lavet en ny konstruktion i Delphi "record helper for [simpel type]". For strenge er dette "type TStringHelper = record helper for string". Navnet angiver "rekordhjælper", men dette handler ikke om at udvide optegnelser - snarere om at udvide enkle typer som strenge, heltal og ens.
I system og system. SysUtils der er andre foruddefinerede posthjælpere til enkle typer, herunder: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (og et par andre). Du kan få fra navnet, hvilken simpel type hjælperen udvider.
Der er også nogle nyttige open source-hjælpere, som TDateTimeHelper.
Tællinger? Hjælper til optællinger?
Tællinger og sæt, der behandles som enkle typer, kan også nu (i XE3 og derover) udvides med funktionalitet, som en posttype kan have: funktioner, procedurer og ens.
Her er en simpel optælling ("TDay") og en rekordhjælper:
type
TDay = (Mandag = 0, tirsdag, onsdag, torsdag, fredag, lørdag, søndag); TDayHelper = rekordhjælper til Tday. fungere AsByte: byte; fungere toString: snor; ende;
fungere TDayHelper. AsByte: byte; begynde
resultat: = Byte (selv); ende; fungere TDayHelper. toString: snor; begyndesag selv af
Mandag: resultat: = 'Mandag'; Tirsdag: resultat: = 'Tirsdag'; Onsdag: resultat: = 'Onsdag'; Torsdag: resultat: = 'Torsdag'; Fredag: resultat: = 'Fredag'; Lørdag: resultat: = 'Lørdag'; Søndag: resultat: = 'søndag'; ende; ende;
Var
aDay: TDay; s: streng; begynde
aDay: = TDay. Mandag; s: = aDay. ToString. At sænke; ende;
Indstiller? Hjælper til sæt?
TDays = sæt af tday;
Var
dage: TDays; s: streng; begynde
dage: = [Mandag.. Onsdag]; dage: = dage + [søndag]; ende;
MEN, hvor STOR ville det være at være i stand til at gøre:
Var
dage: TDays; b: boolsk; begyndedage: = [Mandag, tirsdag] b: = dage. Kryds ((mandag, torsdag)). IsEmpty;
type
TDaysHelper = rekordhjælper til TDays. fungere Krydse(const dage: TDays): TDays; fungere IsEmpty: boolsk; ende;... fungere TDaysHelper. Krydse(const dage: TDays): TDays; begynde
resultat: = selv * dage; ende; fungere TDaysHelper. IsEmpty: boolsk; begynde
resultat: = selv = []; ende;
For hver sættype, der er konstrueret omkring en optælling, skulle du have en separat hjælper, da desværre ikke tællinger og sæt ikke følger med generiske og generiske typer.
Dette betyder, at følgende ikke kan udarbejdes:
// INGEN SAMMENSÆTNING AF LIKE!
TGenericSet = sæt af ;
Optag hjælper til sæt byte!
type
TByteSet = sæt af Byte; TByteSetHelper = rekordhjælper til TByteSet.
Vi kan have følgende i definitionen af TByteSetHelper:
offentligprocedure Klar; procedure Omfatte(const værdi: Byte); overbelaste; inline; procedure Omfatte(const værdier: TByteSet); overbelaste; inline; procedure Udelukke(const værdi: Byte); overbelaste; inline; procedure Udelukke(const værdier: TByteSet); overbelaste; inline; fungere Krydse(const værdier: TByteSet): TByteSet; inline; fungere IsEmpty: boolsk; inline; fungere Inkluderer (const værdi: Byte): boolsk; overbelaste; inline;fungere Inkluderer (const værdier: TByteSet): boolsk; overbelaste; inline;fungere IsSuperSet (const værdier: TByteSet): boolsk; inline; fungere IsSubSet (const værdier: TByteSet): boolsk; inline; fungere Lige med(const værdier: TByteSet): boolsk; inline; fungere toString: snor; inline; ende;
{TByteSetHelper}procedure TByteSetHelper. Medtag (const-værdi: Byte); begynde
System. Inkluder (egen, værdi); ende; procedure TByteSetHelper. Ekskluder (const-værdi: Byte); begynde
System. Ekskluder (selv, værdi); ende; procedure TByteSetHelper. Klar; begynde
selv: = []; ende; fungere TByteSetHelper. Lig (const-værdier: TByteSet): boolsk; begynde
resultat: = selv = værdier; ende; procedure TByteSetHelper. Ekskluder (const-værdier: TByteSet); begynde
selv: = selvværdier; ende; procedure TByteSetHelper. Medtag (const-værdier: TByteSet); begynde
selv: = selv + værdier; ende; fungere TByteSetHelper. Inkluderer (const-værdier: TByteSet): boolsk; begynde
resultat: = IsSuperSet (værdier); ende; fungere TByteSetHelper. Skær hinanden (const-værdier: TByteSet): TByteSet; begynde
resultat: = selv * værdier; ende; fungere TByteSetHelper. Inkluderer (const-værdi: Byte): boolsk; begynde
resultat: = værdi i mig selv; ende; fungere TByteSetHelper. IsEmpty: boolsk; begynde
resultat: = selv = []; ende; fungere TByteSetHelper. IsSubSet (const-værdier: TByteSet): boolsk; begynde
resultat: = selv <= værdier; ende; fungere TByteSetHelper. IsSuperSet (const-værdier: TByteSet): boolsk; begynde
resultat: = selv> = værdier; ende; fungere TByteSetHelper. ToString: streng; Var
b: Byte; begyndetil b i selv gøre
resultat: = resultat + IntToStr (b) + ','; resultat: = Kopi (resultat, 1, -2 + Længde (resultat)); ende;
Var
dageAsByteSet: TByteSet; begynde
daysAsByteSet. Klar; daysAsByteSet. Medtag (mandag. AsByte); daysAsByteSet. Medtag (heltal (lørdag); daysAsByteSet. Inkluder (Byte (TDay. Tirsdag)); daysAsByteSet. Inkluder (heltal (TDay. Onsdag)); daysAsByteSet. Inkluder (heltal (TDay. Onsdag)); // 2. gang - ingen mening. daysAsByteSet. Ekskluder (TDay. Tirsdag. AsByte); ShowMessage (dageAsByteSet. ToString); ShowMessage (BoolToStr (dageAsByteSet) IsSuperSet ([mandag. AsByte, lørdag. AsByte]), sandt)); ende;
Der er et men :(
Bemærk, at TByteSet accepterer byteværdier - og en sådan værdi vil blive accepteret her. TByteSetHelper som implementeret ovenfor er ikke en tællingstype streng (dvs. du kan fodre den med en ikke-TDay-værdi)... men så længe jeg er opmærksom.. det fungerer for mig.