Delphi klassi (ja plaadistamise) abiliste mõistmine

click fraud protection

Mõni aasta tagasi lisatud delphi keele funktsioon (tagasi sisse aastal Delphi) nimega "Klassi abistajad" on loodud selleks, et saaksite olemasolevale klassile (või kirjele) uusi funktsioone lisada, tutvustades klassile (kirjele) uusi meetodeid.

Altpoolt näete veel mõnda ideed klassi abilistele + saate teada, millal ja millal mitte kasutada klassi abilisi.

Klassi abistaja...

Lihtsamalt öeldes on klassi abistaja konstruktsioon, mis laiendab klassi, tutvustades abistajate klassis uusi meetodeid. Klassi abiline võimaldab teil olemasolevat klassi laiendada, ilma et seda tegelikult muudaksite või päriksite.

VCL-i TStrings-klassi laiendamiseks kuulutaksite ja rakendaksite klassi abistajat järgmiselt:

tüüp
TStringsHelper = klassi abiline TStrings. avalikfunktsiooni Sisaldab(const aString: string): loogiline; lõpp; 

Ülaltoodud klass, mida nimetatakse "TStringsHelper", on klassiõpetaja klassi abiline. Pange tähele, et TStrings on määratletud Classes.pas-is, ühikus, mis on vaikimisi saadaval mis tahes klausli jaoks Delphi näiteks vormi ühik.

instagram viewer

Funktsioon, mille lisame oma klassi abilise abil TStringi tüübile, on "Sisaldab". Rakendus võiks välja näha järgmine:

funktsiooni TStringsHelper. Sisaldab(const aString: string): loogiline; alustada
tulemus: = -1 lõpp; 

Olen kindel, et olete seda oma koodis mitu korda kasutanud - et kontrollida, kas mõnel TStringi järeltulijal, näiteks TStringList, on üksuste kogumis mingi stringi väärtus.

Pange tähele, et näiteks a TComboBox või TListBox on TStrings tüüpi.

Pärast rakenduse TStringsHelper rakendamist ja vormil olevat loendikasti (nimega "ListBox1") saate nüüd kontrollida, kas mõni string kuulub loendikasti üksuste atribuuti, kasutades järgmist:

kui Loendiboks1.üksused. Sisaldab ('mingi string') siis... 

Klassi abilised Go ja NoGo

Klassi abiliste rakendamisel on teie kodeerimisele positiivseid ja mõned (võite mõelda) negatiivseid mõjusid.

Üldiselt peaksite vältima oma klasside laiendamist - justkui peate lisama mõnele uuele funktsioonile oma kohandatud klassid - lisage uusi asju vahetult klassi rakendamisel - klassi ei kasutata abistaja.

Klassi abistajad on seetõttu mõeldud rohkem klassi laiendamiseks, kui te ei saa (või ei pea) lootma klassi tavapärandile ja liidese rakendustele.

Klassi abistaja ei saa deklareerida eksemplari andmeid, nagu uued privaatsed väljad (või atribuudid, mis loeksid / kirjutaksid selliseid väljad). Uute klassiväljade lisamine on lubatud.

Klassi abimees saab lisada uusi meetodeid (funktsioon, protseduur).

Enne Delphi XE3 sai laiendada ainult klasse ja kirjeid - keerukaid tüüpe. Delphi XE 3 väljalaskest saate laiendada ka lihtsat tüüpi, näiteks täisarvu või stringi või TDateTime, ja teil on näiteks järgmine konstruktsioon:

var
s: nöör; alustada
s: = 'Delphi XE3 abilised'; s: = s. Suur täht. Tagurpidi; lõpp; 

Kirjutan lähiajal Delphi XE 3 lihtsat tüüpi abistajatest.

Kus on MINU klassi abistaja

Klassi abiliste kasutamise üks piirang, mis võib aidata teil ennast "jalast tulistada", on asjaolu, et saate määratleda ja seostada mitu abilist ühte tüüpi. Kuid lähtekoodi konkreetses asukohas kehtib ainult null või üks abiline. Kohaldatakse lähimas rakenduses määratletud abistajat. Klassi või rekordilise abistaja ulatus määratakse tavapäraselt Delphi mood (näiteks üksuse kasutusklauslis paremalt vasakule).

See tähendab, et võite määratleda kaks TStringsHelperi klassi abilist kahes erinevas üksuses, kuid tegelikult kasutatakse ainult ühte!

Kui klassi abistajat ei määratleta ühikus, kus kasutate selle sissetoodud meetodeid - mis enamasti on nii, siis ei tea te, millist klassi abistaja te tegelikult kasutaksite. Kahel TStrings-klassi abistajal, erinevalt nimetatud või erinevates üksustes elavatel, on ülaltoodud näites meetodi "Sisaldab" erinev rakendamine.

Kas kasutada või mitte?

Jah, kuid võtke arvesse võimalikke kõrvaltoimeid.

Siin on veel üks mugav laiend ülalnimetatud TStringsHelperi klassi abistajale


TStringsHelper = klassi abiline TStrings. privaatnefunktsiooni GetTheObject (const aString: nöör): TObject; protseduur SetTheObject (const aString: nöör; const Väärtus: TObject); avalikvara ObjectFor [const aString: nöör]: TOobjekt loe GetTheObject kirjutada SetTheObject; lõpp;... funktsiooni TStringsHelper. GetTheObject (const aString: nöör): TObject; var
idx: täisarv; alustada
tulemus: = null; idx: = IndexOf (aString); kui idx> -1 siis tulemus: = objektid [idx]; lõpp; protseduur TStringsHelper. SetTheObject (const aString: nöör; const Väärtus: TObject); var
idx: täisarv; alustada
idx: = IndexOf (aString); kui idx> -1 siis Objektid [idx]: = väärtus; lõpp; 

Kui olete olnud objektide lisamine stringide loendisse, võite arvata, millal ülaltoodud käepärase abistaja omadusi kasutada.

instagram story viewer