Înțelegerea ajutorilor din clasa Delphi (și înregistrare)

O caracteristică a limbii Delphi a fost adăugată acum câțiva ani (înapoi în Delphi 2005) numit "Class Helpers" este conceput pentru a vă permite să adăugați o nouă funcționalitate la o clasă existentă (sau o înregistrare) prin introducerea de noi metode în clasă (înregistrare).

Mai jos veți vedea câteva idei pentru asistenții de clasă + aflați când și când nu folosiți asistenții de clasă.

Ajutor de clasă pentru...

În cuvinte simple, un asistent de clasă este o construcție care extinde o clasă prin introducerea de noi metode în clasa de ajutor. Un ajutor de clasă vă permite să extindeți clasa existentă, fără să o modificați sau să moșteniți de la ea.

Pentru a extinde clasa TStrings a VCL, declarați și implementați un asistent de clasă, cum ar fi:

tip
TStringsHelper = ajutor de clasă pentru TStrings. publicfuncţie Conține (const aString: șir): boolean; Sfârșit; 

Clasa de mai sus, numită "TStringsHelper" este un ajutor de clasă pentru tipul TStrings. Rețineți că TStrings este definit în Classes.pas, o unitate disponibilă în mod implicit în clauza de utilizare pentru oricare

instagram viewer
Delphi unitatea formularului, de exemplu.

Funcția pe care o adăugăm la tipul TStrings folosind ajutorul nostru de clasă este „Conține”. Implementarea ar putea arata astfel:

funcţie TStringsHelper. Conține (const aString: șir): boolean; începe
rezultat: = -1 <> IndexOf (aString); Sfârșit; 

Sunt sigur că ai folosit de mai multe ori cele de mai sus în codul tău - pentru a verifica dacă un descendent TStrings, cum ar fi TStringList, are o anumită valoare de șir în colecția de elemente.

Rețineți că, de exemplu, proprietatea Elementele unui TComboBox sau un TListBox este de tip TStrings.

Având implementat TStringsHelper și o casetă de listă dintr-un formular (numit "ListBox1"), puteți verifica dacă unele șiruri fac parte din proprietatea Elemente din caseta de listă folosind:

dacă ListBox1.Items. Conține („unele șiruri”) apoi... 

Class Helpers Go și NoGo

Implementarea asistenților de clasă are unele efecte pozitive și unele (s-ar putea să vă gândiți) la codificarea dvs.

În general, ar trebui să evitați extinderea propriilor clase - ca și cum ar trebui să adăugați unele funcționalități noi propriile clase personalizate - adăugați lucrurile noi în implementarea clasei direct - fără a utiliza o clasă ajutor.

Prin urmare, ajutoarele de clasă sunt mai mult concepute pentru a extinde o clasă atunci când nu puteți (sau nu aveți nevoie) să vă bazați pe moștenirea normală a clasei și implementările interfeței.

Un asistent de clasă nu poate declara date de instanță, cum ar fi câmpuri private noi (sau proprietăți care ar citi / scrie astfel de câmpuri). Adăugarea de câmpuri de clasă noi este permisă.

Un asistent de clasă poate adăuga noi metode (funcție, procedură).

Înainte de Delphi XE3 puteai extinde doar clase și înregistrări - tipuri complexe. De la versiunea Delphi XE 3, puteți extinde tipuri simple precum numerele întregi sau șirurile sau TDateTime și puteți construi astfel:

var
s: șir; începe
s: = 'asistenții Delphi XE3'; s: = s. Majuscule. Inversa; Sfârșit; 

Voi scrie despre Delphi XE 3 tip de ajutor simplu în viitorul apropiat.

Unde este clasa mea de ajutor

O limitare la utilizarea ajutorilor de clasă care v-ar putea ajuta să vă „trageți în picior” este faptul că puteți defini și asocia mai mulți ajutoare cu un singur tip. Cu toate acestea, numai codul zero sau un singur ajutor se aplică în orice locație specifică în codul sursă. Ajutorul definit în cel mai apropiat domeniu de aplicare se va aplica. Domeniul de aplicare a ajutorului de clasă sau de înregistrare este determinat normal Delphi moda (de exemplu, de la dreapta la stânga în clauza de utilizare a unității).

Ce înseamnă acest lucru este că s-ar putea să definiți doi asistenți ai clasei TStringsHelper în două unități diferite, dar numai unul se va aplica atunci când este folosit efectiv!

Dacă un asistent de clasă nu este definit în unitatea în care utilizați metodele sale introduse - ceea ce în majoritatea cazurilor va fi așa, nu știți ce implementare a ajutorului de clasă ați folosi efectiv. Doi asistenți de clasă pentru TStrings, numiți diferit sau rezidenți în unități diferite, ar putea avea o implementare diferită pentru metoda „Conține” din exemplul de mai sus.

Folosiți sau nu?

Da, dar fiți conștienți de posibilele reacții adverse.

Iată o altă extensie la îndemână la asistentul de clasă TStringsHelper menționat mai sus


TStringsHelper = ajutor de clasă pentru TStrings. privatfuncţie GetTheObject (const un șir: şir): TObject; procedură SetTheObject (const un șir: şir; const Valoare: TObject); publicproprietate ObjectFor [const un șir: şir]: TObject citit GetTheObject scrie SetTheObject; Sfârșit;... funcţie TStringsHelper. GetTheObject (const un șir: şir): TObject; var
idx: număr întreg; începe
rezultat: = nil; idx: = IndexOf (aString); dacă idx> -1 apoi rezultat: = Obiecte [idx]; Sfârșit; procedură TStringsHelper. SetTheObject (const un șir: şir; const Valoare: TObject); var
idx: număr întreg; începe
idx: = IndexOf (aString); dacă idx> -1 apoi Obiecte [idx]: = valoare; Sfârșit; 

Dacă ai fost adăugarea de obiecte la o listă de șiruri, puteți ghici când să folosiți proprietatea de ajutor de mai sus.