Delphi-luokan (ja levytys) auttajien ymmärtäminen

Ominaisuus delfi-kielestä, joka on lisätty muutama vuosi sitten (takaisin vuonna Delphissä 2005), nimeltään "Class Helpers", on suunniteltu antamaan sinulle uusia toimintoja olemassa olevaan luokkaan (tai tietueeseen) ottamalla käyttöön uusia menetelmiä luokkaan (tietueeseen).

Alla näet lisää ideoita luokan avustajille + opit milloin ja milloin ei tule käyttää luokan avustajia.

Luokan auttaja...

Yksinkertaisilla sanoilla luokan auttaja on konstruktio, joka laajentaa luokkaa ottamalla käyttöön uusia menetelmiä auttajaluokassa. Luokan auttaja antaa sinun jatkaa olemassa olevaa luokkaa muuttamatta sitä tosiasiallisesti tai perimättä siitä.

Jatkamaan VCL: n TStrings-luokkaa ilmoittamalla ja toteuttamalla luokan avustaja seuraavalla tavalla:

tyyppi
TStringsHelper = luokan auttaja TStrings. julkinentoimia Sisältää(const aString: merkkijono): boolean; pää; 

Yllä oleva luokka, nimeltään "TStringsHelper", on luokan auttaja TStrings-tyypille. Huomaa, että TStrings on määritelty Classes.pas-yksikössä, joka on oletuksena käytettävissä minkä tahansa käyttölausekkeessa

instagram viewer
Delfoi esimerkiksi lomakkeen yksikkö.

Toiminto, jonka lisäämme TStrings-tyyppiin luokkaapurillamme, on "Sisältää". Toteutus voisi näyttää seuraavalta:

toimia TStringsHelper. Sisältää(const aString: merkkijono): boolean; alkaa
tulos: = -1 pää; 

Olen varma, että olet käyttänyt yllä olevaa monta kertaa koodissasi - tarkistaaksesi, onko joillakin TStrings-jälkeläisillä, kuten TStringList, jonkin merkkijonoarvonsa esinekokoelmassa.

Huomaa, että esimerkiksi a TComboBox tai TListBox on TStrings-tyyppiä.

Kun TStringsHelper on otettu käyttöön ja lomakkeen luetteloruutu (nimeltään "ListBox1"), voit nyt tarkistaa, onko jokin merkkijono osa luetteloruudun kohteita -ominaisuutta käyttämällä:

jos ListBox1.Items. Sisältää ('jonkin merkkijonon') sitten... 

Class Helpers Go ja NoGo

Luokan avustajien toteuttamisella on joitain positiivisia ja joitain (saatat ajatella) kielteisiä vaikutuksia koodaukseen.

Yleensä sinun tulisi välttää oman luokkiesi laajentamista - ikään kuin sinun pitäisi lisätä joitain uusia toimintoja omat mukautetut luoksesi - lisää uusia juttuja luokan toteutukseen suoraan - käyttämättä luokkaa auttaja.

Luokan avustajat suunnitellaan siis enemmän pidentämään luokkaa, kun et voi (tai sinun ei tarvitse luottaa) normaaliin luokan perintöön ja käyttöliittymän toteutuksiin.

Luokan auttaja ei voi ilmoittaa ilmentymätietoja, kuten uudet yksityiset kentät (tai ominaisuudet, jotka lukevat / kirjoittavat tällaisia ​​kenttiä). Uusien luokkakenttien lisääminen on sallittua.

Luokan avustaja voi lisätä uusia menetelmiä (toiminto, menettely).

Ennen Delphi XE3: ta voitte vain laajentaa luokkia ja tietueita - monimutkaisia ​​tyyppejä. Delphi XE 3 -julkaisusta voit myös laajentaa yksinkertaisia ​​tyyppejä, kuten kokonaisluku tai merkkijono tai TDateTime, ja rakentaa esimerkiksi:

var
s: merkkijono; alkaa
s: = 'Delphi XE3-auttajat'; s: = s. Isoja. Käänteinen; pää; 

Kirjoitan Delphi XE 3 -tyyppisestä avustajasta lähitulevaisuudessa.

Missä MINUN luokka-auttajani on

Yksi rajoitus luokan avustajien käyttämiselle, joka voi auttaa sinua "ampumaan itseäsi jalaan", on se, että voit määritellä ja yhdistää useita avustajia yhdelle tyypille. Lähdekoodin mihin tahansa tiettyyn sijaintiin sovelletaan kuitenkin vain nollaa tai yhtä avustajaa. Sovelletaan lähimmässä laajuudessa määriteltyä auttajaa. Luokan tai tietueen auttajan laajuus määritetään normaalisti Delfoi muoti (esimerkiksi oikealta vasemmalle yksikön käyttölausekkeessa).

Tämä tarkoittaa, että saatat määritellä kaksi TStringsHelper-luokan auttajaa kahdessa eri yksikössä, mutta vain yhtä sovelletaan, kun niitä todella käytetään!

Jos luokan auttajaa ei ole määritelty yksikössä, jossa käytät sen käyttöönottamia menetelmiä - jotka useimmissa tapauksissa ovat niin, et tiedä mitä luokan avustajan toteutusta käytät. Kahdellä luokan auttajalla TStringsille, nimeltään eri tavalla tai asumalla eri yksiköissä, saattaa olla erilainen toteutus "sisältää" -menetelmälle yllä olevassa esimerkissä.

Käytä vai ei?

Kyllä, mutta ole tietoinen mahdollisista sivuvaikutuksista.

Tässä on toinen kätevä laajennus edellä mainitulle TStringsHelper-luokan auttajalle


TStringsHelper = luokan auttaja TStrings. yksityinentoimia GetTheObject (const nauha: jono): TObject; menettely SetTheObject (const nauha: jono; const Arvo: TObject); julkinenomaisuus ObjectFor [const nauha: jono]: TOobjekti lukea GetTheObject kirjoittaa SetTheObject; pää;... toimia TStringsHelper. GetTheObject (const nauha: jono): TObject; var
idx: kokonaisluku; alkaa
tulos: = nolla; idx: = IndexOf (aString); jos idx> -1 sitten tulos: = Objektit [idx]; pää; menettely TStringsHelper. SetTheObject (const nauha: jono; const Arvo: TObject); var
idx: kokonaisluku; alkaa
idx: = IndexOf (aString); jos idx> -1 sitten Objektit [idx]: = Arvo; pää; 

Jos olet ollut objektien lisääminen merkkijonoluetteloon, voit arvata, milloin yllä olevaa kätevää avustajaominaisuutta käytetään.