Delphi-luokan (ja levytys) auttajien ymmärtäminen esittelee Delphi-kielen ominaisuuden, jonka avulla voit laajentaa luokan tai tietuetyypin määritelmää lisäämällä toimintoja ja menettelyjä (menetelmiä) olemassa oleviin luokkiin ja tietueisiin ilman perintö.
XE3 Delphi -versiossa ennätysavustajat tulivat tehokkaammiksi sallimalla laajentaa yksinkertaisia Delphi-tyyppejä, kuten merkkijonoja, kokonaislukuja, enumeja, sarjoja ja vastaavia.
Systeemi. Delphi XE3: n SysUtils-yksikkö toteuttaa tietueen nimeltä "TStringHelper", joka on tosiasiallisesti nauhojen tietueen auttaja.
Delphi XE3: lla voit koota ja käyttää seuraavaa koodia:
var
s: merkkijono; alkaa
s: = 'Delphi XE3'; s. Korvaa ('XE3', 'säännöt', []). pää;
Jotta tämä olisi mahdollista, Delphiin tehtiin uusi rakenne "levy-avustaja yksinkertaiselle tyypille". Merkkijonoja varten tämä on "tyyppi TStringHelper = merkkijonojen avustaja". Nimessä todetaan "tietueen auttaja", mutta kyse ei ole laajennuksesta asiakirjat - pikemminkin yksinkertaisten tyyppien, kuten merkkijonot, kokonaisluvut ja vastaavat, laajentamisesta.
Järjestelmässä ja järjestelmässä. SysUtilsissa on muita ennalta määritettyjä tietueen avustajia yksinkertaisille tyypeille, mukaan lukien: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (ja muutama muu). Voit saada nimestä, mitä yksinkertaista tyyppiä auttaja laajentaa.
On myös joitain käteviä avoimen lähdekoodin avustajia, kuten TDateTimeHelper.
Laskentatulosten? Avustaja luetteloille?
Yksinkertaisina tyyppeinä käsiteltyjä luetteloita ja joukkoja voidaan nyt (XE3: ssa ja uudemmissakin) myös laajentaa toiminnoilla, joita tietuetyypillä voi olla: toiminnot, menettelyt ja vastaavat.
Tässä on yksinkertainen luettelo ("TDay") ja ennätysapuri:
tyyppi
TDay = (maanantai = 0, tiistai, keskiviikko, torstai, perjantai, lauantai, sunnuntai); TDayHelper = kirjaa auttaja Tday. toimia AsByte: tavu; toimia toString: jono; pää;
toimia TDayHelper. AsByte: tavu; alkaa
tulos: = tavu (itse); pää; toimia TDayHelper. toString: jono; alkaatapaus itse of
Maanantai: tulos: = 'maanantai'; Tiistai: tulos: = 'Tiistai'; Keskiviikko: tulos: = 'keskiviikko'; Torstai: tulos: = 'torstai'; Perjantai: tulos: = 'perjantai'; Lauantai: tulos: = 'lauantai'; Sunnuntai: tulos: = 'sunnuntai'; pää; pää;
var
aDay: TDay; s: merkkijono; alkaa
aDay: = TDay. Maanantai; s: = päivä. ToString. Laskea; pää;
Sarjaa? Auttaa sarjoja?
TDays = joukko tday;
var
päivää: TDays; s: merkkijono; alkaa
päivää: = [maanantai.. Keskiviikko]; päivää: = päivää + [sunnuntai]; pää;
MITÄ, kuinka mahtavaa se voisi olla:
var
päivää: TDays; b: boolean; alkaapäivää: = [maanantai, tiistai] b: = päivää. Risteys ([maanantai, torstai]). IsEmpty;
tyyppi
TDaysHelper = kirjaa auttaja TDays. toimia Intersect (const päivää: TDays): TDays; toimia IsEmpty: boolean; end;... toimia TDaysHelper. Intersect (const päivää: TDays): TDays; alkaa
tulos: = itse * päivää; pää; toimia TDaysHelper. IsEmpty: boolean; alkaa
tulos: = itse = []; pää;
Jokaisella luettelon ympärille rakennetulla sarjoilla tarvitset erillisen avustajan, koska valitettavasti luettelot ja sarjat eivät kulje geneeriset ja geneeriset tyypit.
Tämä tarkoittaa, että seuraavaa ei voida koota:
// EI KOSKEVAA SAMANKALTAINEN!
TGenericSet = joukko ;
Levy-auttaja tavujoukolle!
tyyppi
TByteSet = joukko Tavu; TByteSetHelper = kirjaa auttaja TByteSet.
Meillä voi olla seuraavat määritelmät TByteSetHelper: ssä:
julkinenmenettely Asia selvä; menettely Sisältää(const arvo: tavu); ylikuormittaa; linjassa; menettely Sisältää(const arvot: TByteSet); ylikuormittaa; linjassa; menettely Jätä pois (const arvo: tavu); ylikuormittaa; linjassa; menettely Jätä pois (const arvot: TByteSet); ylikuormittaa; linjassa; toimia Intersect (const arvot: TByteSet): TByteSet; linjassa; toimia IsEmpty: boolean; linjassa; toimia sisältää (const arvo: Tavu): boolean; ylikuormitus; linjassa;toimia sisältää (const arvot: TByteSet): boolean; ylikuormitus; linjassa;toimia IsSuperSet (const arvot: TByteSet): boolean; linjassa; toimia IsSubSet (const arvot: TByteSet): boolean; linjassa; toimia equals (const arvot: TByteSet): boolean; linjassa; toimia toString: jono; linjassa; pää;
{TByteSetHelper}menettely TByteSetHelper. Sisällytä (vakioarvo: tavu); alkaa
Järjestelmä. Sisällytä (itse, arvo); pää; menettely TByteSetHelper. Sulje pois (const-arvo: tavu); alkaa
Järjestelmä. Sulje pois (itse, arvo); pää; menettely TByteSetHelper. Asia selvä; alkaa
itse: = []; pää; toimia TByteSetHelper. Yhtä (const-arvot: TByteSet): boolean; alkaa
tulos: = itse = arvot; pää; menettely TByteSetHelper. Sulje pois (const-arvot: TByteSet); alkaa
itse: = itsearvot; pää; menettely TByteSetHelper. Sisällytä (const-arvot: TByteSet); alkaa
itse: = itse + arvot; pää; toimia TByteSetHelper. Sisältää (const-arvot: TByteSet): boolean; alkaa
tulos: = IsSuperSet (arvot); pää; toimia TByteSetHelper. Risteys (const-arvot: TByteSet): TByteSet; alkaa
tulos: = itse * arvot; pää; toimia TByteSetHelper. Sisältää (vakioarvo: Tavu): boolean; alkaa
tulos: = arvo itsessään; pää; toimia TByteSetHelper. IsEmpty: boolean; alkaa
tulos: = itse = []; pää; toimia TByteSetHelper. IsSubSet (const-arvot: TByteSet): boolean; alkaa
tulos: = itse <= arvot; pää; toimia TByteSetHelper. IsSuperSet (const-arvot: TByteSet): boolean; alkaa
tulos: = itse> = arvot; pää; toimia TByteSetHelper. ToString: merkkijono; var
b: Tavu; alkaavarten b sisään itse tehdä
tulos: = tulos + IntToStr (b) + ','; tulos: = Kopio (tulos, 1, -2 + pituus (tulos)); pää;
var
daysAsByteSet: TByteSet; alkaa
daysAsByteSet. Asia selvä; daysAsByteSet. Sisällytä (maanantai. AsByte); daysAsByteSet. Sisällytä (kokonaisluku (lauantai); daysAsByteSet. Sisällytä (tavu (TDay. Tiistai)); daysAsByteSet. Sisällytä (kokonaisluku (TDay. Keskiviikko)); daysAsByteSet. Sisällytä (kokonaisluku (TDay. Keskiviikko)); // 2. kerta - ei järkeä. daysAsByteSet. Sulje pois (TDay. Tiistai. AsByte); Näytä viesti (daysAsByteSet. ToString); Näytä viesti (BoolToStr (daysAsByteSet). IsSuperSet ([maanantaina. AsByte, lauantai. AsByte]), totta)); pää;
Siellä on mutta :(
Huomaa, että TByteSet hyväksyy tavun arvot - ja kaikki tällaiset arvot hyväksytään täällä. Edellä toteutettu TByteSetHelper ei ole luettelotyyppi tiukka (ts. Voit syöttää sen muulla kuin TDay-arvolla)... mutta niin kauan kuin tiedän.. se toimii minulle.