A Delphi osztály segítőinek megértése bevezeti a Delphi nyelv olyan tulajdonságát, amely lehetővé teszi az osztály vagy rekordtípus meghatározásának kibővítését, a függvények és eljárások (módszerek) hozzáadásával a meglévő osztályokhoz és rekordokhoz öröklés.
Az XE3 Delphi verzióban a rekordsegédek erősebbek lettek, amikor lehetővé tették az egyszerű Delphi típusok, például karakterláncok, egész számok, enumok, halmazok és hasonlók kiterjesztését.
A rendszer. A SysUtils egység, a Delphi XE3-tól, egy "TStringHelper" nevű rekordot valósít meg, amely valójában húrok rekordsegédje.
A Delphi XE3 használatával lefordíthatja és felhasználhatja a következő kódot:
var
s: húr; kezdődik
s: = 'Delphi XE3'; s. Cserélje ki ('XE3', 'szabályok', []). ToUpper; vég;
Ahhoz, hogy ez lehetséges, egy új konstrukciót készítettek a Delphi-ben "rekord helper [egyszerű típushoz]". Karakterláncok esetében ez a "type TStringHelper = record helper for string". A név kimondja: "rekordsegéd", de ez nem a meghosszabbításról szól
feljegyzések - inkább az egyszerű típusok, például húrok, egész számok és hasonló kiterjesztéséről.A Rendszerben és a Rendszerben. A SysUtils-nak vannak más előre meghatározott rögzítési segítői az egyszerű típusokhoz, ideértve: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (és néhány másik). A névből megtudhatja, hogy milyen egyszerű típust nyújt a segítő.
Vannak praktikus nyílt forráskódú segítők is, például TDateTimeHelper.
Felsorolások? Segítő a felsorolásokhoz?
Az egyszerű típusként kezelt felsorolások és halmazok (XE3-ban és annál később is) kibővíthetők olyan funkciókkal, amelyek egy rekordtípusnak rendelkezhetnek: funkciókkal, eljárásokkal és hasonlóakkal.
Itt van egy egyszerű felsorolás ("TDay") és egy rekord segítő:
típus
TDay = (hétfő = 0, kedd, szerda, csütörtök, péntek, szombat, vasárnap); TDayHelper = rekord helper TDay. funkció AsByte: byte; funkció toString: húr; vég;
funkció TDayHelper. AsByte: byte; kezdődik
eredmény: = Byte (én); vég; funkció TDayHelper. toString: húr; kezdődikügy maga nak,-nek
Hétfő: eredmény: = 'hétfő'; Kedd: eredmény: = 'kedd'; Szerda: eredmény: = 'szerda'; Csütörtök: eredmény: = „csütörtök”; Péntek: eredmény: = „péntek”; Szombat: eredmény: = 'szombat'; Vasárnap: eredmény: = 'vasárnap'; vég; vég;
var
aDay: TDay; s: húr; kezdődik
aDay: = TDay. Hétfő; s: = anap. ToString. ToLower; vég;
Készletek? Segítőkészlet?
TDays = készlet TDay;
var
napok: TDays; s: húr; kezdődik
napok: = [hétfő.. Szerda]; napok: = napok + [vasárnap]; vég;
De mennyire nagyszerű lenne, ha képes lenne:
var
napok: TDays; b: logikai; kezdődiknapok: = [hétfő, kedd] b: = nap. Kereszteződés ([hétfő, csütörtök]).
típus
TDaysHelper = rekord helper TDays. funkció Metszet (const napok: TDays): TDays; funkció IsEmpty: logikai; végén;... funkció TDaysHelper. Metszet (const napok: TDays): TDays; kezdődik
eredmény: = saját * nap; vég; funkció TDaysHelper. IsEmpty: logikai; kezdődik
eredmény: = saját = []; vég;
Minden felsorolás köré épített halmaztípushoz külön helperre van szüksége, mivel sajnos a felsorolások és halmazok nem haladnak végig generikus és generikus típusok.
Ez azt jelenti, hogy a következőket nem lehet összeállítani:
// NINCS ÖSSZESEN!
TGenericSet = készlet ;
Rekordsegéd byte-készlethez!
típus
TByteSet = készlet Byte; TByteSetHelper = rekord helper TByteSet.
A TByteSetHelper meghatározásában a következők találhatók:
nyilvánoseljárás Egyértelmű; eljárás include (const érték: Byte); túlterhelés; Sorban; eljárás include (const értékek: TByteSet); túlterhelés; Sorban; eljárás kizárása (const érték: Byte); túlterhelés; Sorban; eljárás kizárása (const értékek: TByteSet); túlterhelés; Sorban; funkció Metszet (const értékek: TByteSet): TByteSet; Sorban; funkció IsEmpty: logikai; Sorban; funkció Magába foglalja(const érték: Byte): logikai; túlterhelés; Sorban;funkció Magába foglalja(const értékek: TByteSet): logikai; túlterhelés; Sorban;funkció IsSuperSet (const értékek: TByteSet): logikai; Sorban; funkció IsSubSet (const értékek: TByteSet): logikai; Sorban; funkció Egyenlő (const értékek: TByteSet): logikai; Sorban; funkció toString: húr; Sorban; vég;
{TByteSetHelper}eljárás TByteSetHelper. Tartalmazza (const érték: Byte); kezdődik
Rendszer. Tartalmazza (ön, érték); vég; eljárás TByteSetHelper. Kizárás (const érték: Byte); kezdődik
Rendszer. Kizárja (ön, érték); vég; eljárás TByteSetHelper. Egyértelmű; kezdődik
én: = []; vég; funkció TByteSetHelper. Egyenlő (const értékek: TByteSet): logikai; kezdődik
eredmény: = én = értékek; vég; eljárás TByteSetHelper. Kizárás (const értékek: TByteSet); kezdődik
én: = önértékek; vég; eljárás TByteSetHelper. Tartalmazza (const értékek: TByteSet); kezdődik
én: = én + értékek; vég; funkció TByteSetHelper. Tartalmazza (const értékek: TByteSet): logikai; kezdődik
eredmény: = IsSuperSet (értékek); vég; funkció TByteSetHelper. Kereszteződés (const értékek: TByteSet): TByteSet; kezdődik
eredmény: = saját * értékek; vég; funkció TByteSetHelper. Tartalmazza (const érték: Byte): logikai; kezdődik
eredmény: = érték önmagában; vég; funkció TByteSetHelper. IsEmpty: logikai; kezdődik
eredmény: = saját = []; vég; funkció TByteSetHelper. IsSubSet (const értékek: TByteSet): logikai; kezdődik
eredmény: = saját <= értékek; vég; funkció TByteSetHelper. IsSuperSet (const értékek: TByteSet): logikai; kezdődik
eredmény: = saját> = értékek; vég; funkció TByteSetHelper. ToString: húr; var
b: Byte; kezdődikmert b ban ben maga csinál
eredmény: = eredmény + IntToStr (b) + ','; eredmény: = Másolás (eredmény, 1, -2 + Hossz (eredmény)); vég;
var
daysAsByteSet: TByteSet; kezdődik
daysAsByteSet. Egyértelmű; daysAsByteSet. Tartalmazza (hétfő. AsByte); daysAsByteSet. Tartalmazza (egész szám (szombat); daysAsByteSet. Beilleszteni (Byte (TDay. Kedd)); daysAsByteSet. Belefoglalás (egész szám (TDay. Szerda)); daysAsByteSet. Belefoglalás (egész szám (TDay. Szerda)); // Második alkalom - nincs értelme. daysAsByteSet. Kizárás (TDay. Kedd. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([hétfőn. AsByte, szombat. AsByte]), igaz)); vég;
Van egy, de :(
Vegye figyelembe, hogy a TByteSet elfogadja a byte-értékeket - és minden ilyen érték itt elfogadásra kerül. A TByteSetHelper a fentiek szerint nem szigorúan szerepel a felsorolásban (azaz nem TDay értékkel adhatja meg)... de amíg tisztában vagyok.. nekem jól működik.