Razumijevanje pomagača klase Delphi (i zapisa)

Značajka jezika Delphi dodana je prije nekoliko godina (unazad u Delphiju 2005) nazvana "Pomoćnici klase" dizajnirana je tako da vam omogućuje dodavanje nove funkcionalnosti postojećoj klasi (ili zapisu) uvođenjem novih metoda u klasu (zapis).

U nastavku ćete vidjeti još nekoliko ideja za pomoćnike u nastavi + naučiti kada i kada ne koristiti pomagače klase.

Pomoćnik klase za...

Jednostavnim riječima, pomoćnik u klasi je konstrukcija koja proširuje klasu uvođenjem novih metoda u klasu pomagača. Pomoćnik klase omogućava vam da proširite postojeću klasu bez da je zapravo modificirate ili naslijedite od nje.

Za proširenje VCL-ove TStrings klase izjavit ćete i implementirati pomoćnika klase kao što je slijedeće:

tip
TStringsHelper = pomoćnik klase za TStrings. javnostfunkcija sadrži (const aString: string): boolean; kraj; 

Gornja klasa, koja se naziva "TStringsHelper", je pomoćnik klase za TStrings tip. Imajte na umu da su TStrings definirani u Classes.pas, jedinici koja je prema zadanim postavkama dostupna u klauzuli upotrebe za bilo koju Delphi Na primjer, jedinica jedinice.

instagram viewer

Funkcija koju dodajemo vrsti TStrings pomoću pomagača naše klase je "Sadrži". Provedba bi mogla izgledati kao:

funkcija TStringsHelper. sadrži (const aString: string): boolean; početi
rezultat: = -1 <> IndexOf (aString); kraj; 

Sigurna sam da ste koristili gore navedeno više puta u vašem kodu - da biste provjerili ima li neki TStrings potomak, poput TStringList-a, neku vrijednost stringa u svojoj zbirci Items.

Imajte na umu da, na primjer, svojstvo Items za TComboBox ili je TListBox tipa TStrings.

Nakon što je TStringsHelper implementiran i okvir s popisom na obrascu (nazvanom "ListBox1"), sada možete provjeriti je li neki niz dio svojstva predmeta svojstva u popisu koristeći:

ako ListBox1.Items. Sadrži ('neki niz') zatim... 

Pomoćnici klase Go i NoGo

Implementacija pomoćnika klase ima neke pozitivne, a neke (možda ćete pomisliti) negativne utjecaje na vaše kodiranje.

Općenito, trebali biste izbjegavati proširenje vlastitih predavanja - kao da biste trebali dodati neku novu funkcionalnost svoje prilagođene klase - dodajte nove stvari u implementaciju klase izravno - ne koristeći klasu pomagač.

Pomoćnici klase stoga su više dizajnirani za proširenje klase kada se ne možete (ili ne trebate) osloniti na normalno nasljeđivanje klase i implementacije sučelja.

Pomoćnik klase ne može deklarirati podatke instanci, poput novih privatnih polja (ili svojstava koja bi čitala / pisala takva polja). Dodavanje novih polja klase je dopušteno.

Pomagač klase može dodati nove metode (funkcija, postupak).

Prije Delphija XE3 mogli ste proširiti samo klase i zapise - složene vrste. Iz izdanja Delphi XE 3 možete proširiti i jednostavne tipove poput cjelobrojnih ili nizova ili TDateTime te imati sljedeće:

var
s: string; početi
s: = 'Delphi XE3 pomagači'; s: = s. Velika slova. obrnuti; kraj; 

O Delphi XE 3 pomoćniku jednostavnog tipa pisat ću u bliskoj budućnosti.

Gdje je pomoćnik moje klase

Jedno ograničenje upotrebe pomagača iz klase koje bi vam moglo pomoći u "pucanju u nogu" je činjenica da možete definirati i povezati više pomagača s jednom vrstom. Međutim, na bilo kojem mjestu u izvornom kodu primjenjuje se samo nula ili jedan pomagač. Primijenit će se pomagač definiran u najbližem opsegu. Opseg pomagača za klasu ili evidenciju određuje se u normalu Delphi moda (na primjer, desno lijevo u klauzuli o upotrebi jedinice).

To znači da možete definirati dva pomoćnika klase TStringsHelper u dvije različite jedinice, ali samo će se jedan primijeniti kada se stvarno koristi!

Ako pomoćnik klase nije definiran u jedinici u kojoj koristite uvedene metode - što će u većini slučajeva biti tako, ne znate koju biste implementaciju pomagača klase zapravo koristili. Dvije pomoćne skupine za TStrings, različito imenovane ili se nalaze u različitim jedinicama, mogu imati različitu implementaciju za metodu "Sadrži" u gornjem primjeru.

Koristite ili ne?

Da, ali budite svjesni mogućih nuspojava.

Evo još jednog zgodnog proširenja gore spomenutog pomoćnika TStringsHelper klase


TStringsHelper = pomoćnik klase za TStrings. privatnafunkcija GetTheObject (const žica: niz): TObject; postupak SetTheObject (const žica: niz; const Vrijednost: TObject); javnostsvojstvo ObjectFor [const žica: niz]: TObject čitati GetTheObject pisati SetTheObject; kraj;... funkcija TStringsHelper. GetTheObject (const žica: niz): TObject; var
idx: cijeli broj; početi
rezultat: = nula; idx: = IndexOf (aString); ako idx> -1 zatim rezultat: = Objekti [idx]; kraj; postupak TStringsHelper. SetTheObject (const žica: niz; const Vrijednost: TObject); var
idx: cijeli broj; početi
idx: = IndexOf (aString); ako idx> -1 zatim Objekti [idx]: = Vrijednost; kraj; 

Ako ste već bili dodavanje objekata na popis niza, možete pogoditi kada koristiti gornje korisno svojstvo pomagača.

instagram story viewer