Förstå Delphi Class (och spela in) hjälpare introducerar en funktion i Delphi-språket så att du kan utöka definitionen av en klass eller en posttyp genom att lägga till funktioner och procedurer (metoder) till befintliga klasser och poster utan arv.
I XE3 Delphi-versionen blev rekordhjälpare kraftigare genom att tillåta att utöka enkla Delphi-typer som strängar, heltal, enums, uppsättningar och lika.
Systemet. SysUtils-enheten, från Delphi XE3, implementerar en post med namnet "TStringHelper" som faktiskt är en rekordhjälpare för strängar.
Med hjälp av Delphi XE3 kan du sammanställa och använda nästa kod:
var
s: sträng; Börja
s: = 'Delphi XE3'; s. Ersätt ('XE3', 'regler', []). ToUpper; slutet;
För att detta skulle vara möjligt gjordes en ny konstruktion i Delphi "skivhjälpare för [enkel typ]". För strängar är detta "typ TStringHelper = record helper for string". Namnet anger "rekordhjälpare" men det handlar inte om att förlänga uppgifter - snarare om att utöka enkla typer som strängar, heltal och lika.
I system och system. SysUtils finns det andra fördefinierade rekordhjälpare för enkla typer, inklusive: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (och några andra). Du kan få från namnet vilken enkel typ hjälperen utökar.
Det finns också några praktiska open source-hjälpare, som TDateTimeHelper.
Uppräkningar? Hjälpare för uppräkningar?
Uppräkningar och uppsättningar som behandlas som enkla typer kan också nu (i XE3 och senare) utvidgas med funktionalitet som en posttyp kan ha: funktioner, procedurer och lika.
Här är en enkel uppräkning ("TDay") och en rekordhjälpare:
typ
TDay = (måndag = 0, tisdag, onsdag, torsdag, fredag, lördag, söndag); TDayHelper = rekordhjälpare för Tday. fungera AsByte: byte; fungera Att stränga: sträng; slutet;
fungera TDayHelper. AsByte: byte; Börja
resultat: = Byte (själv); slutet; fungera TDayHelper. Att stränga: sträng; Börjafall själv av
Måndag: resultat: = 'Måndag'; Tisdag: resultat: = 'Tisdag'; Onsdag: resultat: = 'onsdag'; Torsdag: resultat: = 'Torsdag'; Fredag: resultat: = 'Fredag'; Lördag: resultat: = 'Lördag'; Söndag: resultat: = 'söndag'; slutet; slutet;
var
aDay: TDay; s: sträng; Börja
aDay: = TDay. måndag; s: = aDay. Att stränga. Att sänka; slutet;
Uppsättningar? Hjälper för uppsättningar?
TDays = uppsättning av tday;
var
dagar: TDays; s: sträng; Börja
dagar: = [måndag.. Onsdag]; dagar: = dagar + [söndag]; slutet;
MEN, hur STOR skulle det vara att kunna göra:
var
dagar: TDays; b: booleska; Börjadagar: = [Måndag, tisdag] b: = dagar. Korsa ([måndag, torsdag]). IsEmpty;
typ
TDaysHelper = rekordhjälpare för TDays. fungera Korsas(const dagar: TDays): TDays; fungera IsEmpty: boolean; slutet;... fungera TDaysHelper. Korsas(const dagar: TDays): TDays; Börja
resultat: = själv * dagar; slutet; fungera TDaysHelper. IsEmpty: boolean; Börja
resultat: = själv = []; slutet;
För varje uppsättningstyp som är konstruerad kring en uppräkning skulle du behöva ha en separat hjälper eftersom tyvärr inte uppräkningar och uppsättningar går med generiska och generiska typer.
Detta innebär att följande inte kan sammanställas:
// INGEN SAMMANFATTNING AV LIKE!
TGenericSet = uppsättning av ;
Spela in Hjälpare för uppsättning av Byte!
typ
TByteSet = uppsättning av byte; TByteSetHelper = rekordhjälpare för TByteSet.
Vi kan ha följande i definitionen av TByteSetHelper:
offentligprocedur Klar; procedur Inkludera(const värde: Byte); överbelastning; i kö; procedur Inkludera(const värden: TByteSet); överbelastning; i kö; procedur Utesluta(const värde: Byte); överbelastning; i kö; procedur Utesluta(const värden: TByteSet); överbelastning; i kö; fungera Korsas(const värden: TByteSet): TByteSet; i kö; fungera IsEmpty: boolean; i kö; fungera inkluderar (const värde: Byte): boolean; överbelastning; i kö;fungera inkluderar (const värden: TByteSet): boolean; överbelastning; i kö;fungera IsSuperSet (const värden: TByteSet): boolean; i kö; fungera IsSubSet (const värden: TByteSet): boolean; i kö; fungera equals (const värden: TByteSet): boolean; i kö; fungera Att stränga: sträng; i kö; slutet;
{TByteSetHelper}procedur TByteSetHelper. Inkludera (const-värde: Byte); Börja
Systemet. Inkludera (själv, värde); slutet; procedur TByteSetHelper. Uteslut (const-värde: Byte); Börja
Systemet. Uteslut (själv, värde); slutet; procedur TByteSetHelper. Klar; Börja
själv: = []; slutet; fungera TByteSetHelper. Lika (konstvärden: TByteSet): boolean; Börja
resultat: = själv = värden; slutet; procedur TByteSetHelper. Uteslut (const-värden: TByteSet); Börja
själv: = självvärden; slutet; procedur TByteSetHelper. Inkludera (const-värden: TByteSet); Börja
jaget: = själv + värden; slutet; fungera TByteSetHelper. Inkluderar (const-värden: TByteSet): boolean; Börja
resultat: = IsSuperSet (värden); slutet; fungera TByteSetHelper. Korsa (const-värden: TByteSet): TByteSet; Börja
resultat: = själv * värden; slutet; fungera TByteSetHelper. Inkluderar (konstvärde: Byte): boolean; Börja
resultat: = värde i jaget; slutet; fungera TByteSetHelper. IsEmpty: boolean; Börja
resultat: = själv = []; slutet; fungera TByteSetHelper. IsSubSet (konstvärden: TByteSet): boolean; Börja
resultat: = själv <= värden; slutet; fungera TByteSetHelper. IsSuperSet (konstvärden: TByteSet): boolean; Börja
resultat: = själv> = värden; slutet; fungera TByteSetHelper. ToString: string; var
b: Byte; Börjaför b i själv do
resultat: = resultat + IntToStr (b) + ','; resultat: = Kopiera (resultat, 1, -2 + Längd (resultat)); slutet;
var
dagarAsByteSet: TByteSet; Börja
daysAsByteSet. Klar; daysAsByteSet. Inkludera (måndag. AsByte); daysAsByteSet. Inkludera (heltal (lördag); daysAsByteSet. Inkludera (Byte (TDay. Tisdag)); daysAsByteSet. Inkludera (heltal (TDay. Onsdag)); daysAsByteSet. Inkludera (heltal (TDay. Onsdag)); // 2: a gången - ingen mening. daysAsByteSet. Uteslut (TDay. Tisdag. AsByte); ShowMessage (dagarAsByteSet. Att stränga); ShowMessage (BoolToStr (dagarAsByteSet) IsSuperSet ([måndag. AsByte, lördag. AsByte]), sant)); slutet;
Det finns en men :(
Observera att TByteSet accepterar bytevärden - och sådant värde skulle accepteras här. TByteSetHelper, som implementerad ovan, är inte strikt för uppräkningstyp (dvs. du kan mata den med ett icke-TDay-värde)... men så länge jag är medveten.. det fungerar för mig.