Helpers van Delphi Class (en Record) begrijpen introduceert een functie van de Delphi-taal waarmee u de definitie van een klasse of een recordtype kunt uitbreiden door functies en procedures (methoden) toe te voegen aan bestaande klassen en records zonder erfenis.
In de XE3 Delphi-versie werden recordhelpers krachtiger door eenvoudige Delphi-typen zoals tekenreeksen, gehele getallen, enums, sets en dergelijke toe te staan.
Het systeem. SysUtils-eenheid, van Delphi XE3, implementeert een record met de naam "TStringHelper", wat eigenlijk een recordhelper voor strijkers is.
Met Delphi XE3 kunt u de volgende code compileren en gebruiken:
var
s: string; beginnen
s: = 'Delphi XE3'; s. Vervangen ('XE3', 'regels', []). ToUpper; einde;
Om dit mogelijk te maken, werd een nieuwe constructie gemaakt in Delphi "recordhelper voor [eenvoudig type]". Voor tekenreeksen is dit "type TStringHelper = record helper for string". De naam vermeldt "recordhelper" maar dit gaat niet over uitbreiden records - liever over het uitbreiden van eenvoudige typen zoals tekenreeksen, gehele getallen en dergelijke.
In systeem en systeem. SysUtils Er zijn andere vooraf gedefinieerde recordhelpers voor eenvoudige typen, waaronder: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (en een paar andere). Je kunt aan de naam zien welk eenvoudig type de helper uitbreidt.
Er zijn ook enkele handige open source helpers, zoals TDateTimeHelper.
Opsommingen? Helper voor opsommingen?
Tellingen en sets die als eenvoudige typen worden behandeld, kunnen nu ook (in XE3 en later) worden uitgebreid met functionaliteit die een recordtype kan hebben: functies, procedures en dergelijke.
Hier is een eenvoudige opsomming ("TDay") en een recordhulp:
type
TDay = (maandag = 0, dinsdag, woensdag, donderdag, vrijdag, zaterdag, zondag); TDayHelper = record helper voor TDay. functie AsByte: byte; functie ToString: draad; einde;
functie TDayHelper. AsByte: byte; beginnen
resultaat: = Byte (zelf); einde; functie TDayHelper. ToString: draad; beginnengeval zelf van
Maandag: resultaat: = 'Maandag'; Dinsdag: resultaat: = 'dinsdag'; Woensdag: resultaat: = 'woensdag'; Donderdag: resultaat: = 'donderdag'; Friday: result: = 'Friday'; Zaterdag: resultaat: = 'zaterdag'; Zondag: resultaat: = 'zondag'; einde; einde;
var
aDay: TDay; s: string; beginnen
aDay: = TDay. Maandag; s: = aDag. ToString. Verlagen; einde;
Sets? Helper voor sets?
TDays = set van TDay;
var
dagen: TDays; s: string; beginnen
dagen: = [maandag.. Woensdag]; dagen: = dagen + [zondag]; einde;
MAAR hoe geweldig zou het zijn om te kunnen doen:
var
dagen: TDays; b: boolean; beginnendagen: = [maandag, dinsdag] b: = dagen. Kruispunt ([maandag, donderdag]). Is leeg;
type
TDaysHelper = record helper voor TDays. functie Snijden(const dagen: TDays): TDays; functie IsEmpty: boolean; einde;... functie TDaysHelper. Snijden(const dagen: TDays): TDays; beginnen
resultaat: = zelf * dagen; einde; functie TDaysHelper. IsEmpty: boolean; beginnen
resultaat: = self = []; einde;
Voor elk settype dat is opgebouwd rond een opsomming, zou je een aparte helper moeten hebben, want helaas tellen opsommingen en sets niet mee generieke en generieke types.
Dit betekent dat het volgende niet kan worden samengesteld:
// GEEN COMPILE ALS GELIJK!
TGenericSet = set van ;
Record Helper voor Set Of Byte!
type
TByteSet = set van Byte; TByteSetHelper = record helper voor TByteSet.
We kunnen het volgende hebben in de definitie van de TByteSetHelper:
openbaarprocedure Doorzichtig; procedure Opnemen (const waarde: Byte); overbelasten; in lijn; procedure Opnemen (const waarden: TByteSet); overbelasten; in lijn; procedure Uitsluiten(const waarde: Byte); overbelasten; in lijn; procedure Uitsluiten(const waarden: TByteSet); overbelasten; in lijn; functie Snijden(const waarden: TByteSet): TByteSet; in lijn; functie IsEmpty: boolean; in lijn; functie Omvat (const waarde: Byte): boolean; overbelasten; in lijn;functie Omvat (const waarden: TByteSet): boolean; overbelasten; in lijn;functie IsSuperSet (const waarden: TByteSet): boolean; in lijn; functie IsSubSet (const waarden: TByteSet): boolean; in lijn; functie Is gelijk aan (const waarden: TByteSet): boolean; in lijn; functie ToString: draad; in lijn; einde;
{TByteSetHelper}procedure TByteSetHelper. Opnemen (const waarde: Byte); beginnen
Systeem. Inclusief (zelf, waarde); einde; procedure TByteSetHelper. Uitsluiten (const waarde: Byte); beginnen
Systeem. Uitsluiten (zelf, waarde); einde; procedure TByteSetHelper. Doorzichtig; beginnen
zelf: = []; einde; functie TByteSetHelper. Is gelijk aan (const-waarden: TByteSet): boolean; beginnen
resultaat: = self = waarden; einde; procedure TByteSetHelper. Exclude (const waarden: TByteSet); beginnen
self: = self - waarden; einde; procedure TByteSetHelper. Opnemen (const-waarden: TByteSet); beginnen
self: = self + waarden; einde; functie TByteSetHelper. Omvat (const-waarden: TByteSet): boolean; beginnen
resultaat: = IsSuperSet (waarden); einde; functie TByteSetHelper. Snijden (const-waarden: TByteSet): TByteSet; beginnen
resultaat: = self * waarden; einde; functie TByteSetHelper. Omvat (const waarde: Byte): boolean; beginnen
resultaat: = waarde in zichzelf; einde; functie TByteSetHelper. IsEmpty: boolean; beginnen
resultaat: = self = []; einde; functie TByteSetHelper. IsSubSet (const waarden: TByteSet): boolean; beginnen
resultaat: = zelf <= waarden; einde; functie TByteSetHelper. IsSuperSet (const waarden: TByteSet): boolean; beginnen
resultaat: = zelf> = waarden; einde; functie TByteSetHelper. ToString: string; var
b: Byte; beginnenvoor b in zelf Doen
resultaat: = resultaat + IntToStr (b) + ','; resultaat: = Kopiëren (resultaat, 1, -2 + Lengte (resultaat)); einde;
var
daysAsByteSet: TByteSet; beginnen
daysAsByteSet. Doorzichtig; daysAsByteSet. Opnemen (maandag. AsByte); daysAsByteSet. Opnemen (geheel getal (zaterdag); daysAsByteSet. Inclusief (Byte (TDay. Dinsdag)); daysAsByteSet. Opnemen (Integer (TDay. Woensdag)); daysAsByteSet. Opnemen (Integer (TDay. Woensdag)); // 2e keer - geen zin. daysAsByteSet. Uitsluiten (TDay. Dinsdag. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([maandag. AsByte, zaterdag. AsByte]), waar)); einde;
Er is een maar :(
Merk op dat TByteSet bytewaarden accepteert - en een dergelijke waarde zou hier worden geaccepteerd. De TByteSetHelper zoals hierboven geïmplementeerd is niet opsommingstype strikt (d.w.z. u kunt het voeden met een niet-TDay-waarde)... maar zolang ik weet... het werkt voor mij.