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

O caracteristică a limbii Delphi adăugată cu câțiva ani în urmă (revenirea în Delphi 2005) numită „Class Helpers” este proiectată pentru a vă permite să adăugați o funcționalitate nouă unei clase (sau a unei înregistrări) existente 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 public funcţ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 care este disponibilă în mod implicit în clauza de utilizare pentru orice unitate a formularului Delphi, 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.Contains (const aString: șir): boolean; începe rezultat: = -1 IndexOf (aString); Sfârșit; 

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

Rețineți că, de exemplu, proprietatea Elementele unui TComboBox sau ale unui TListBox este de tipul 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.Contains ("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 la propriile clase personalizate - adăugați lucrurile noi în implementarea clasei direct - fără a utiliza un 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 string sau TDateTime și puteți construi astfel:

 var s: șir; începe s: = 'asistenții Delphi XE3'; s: = s.UpperCase.Revers; 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 ajutoare pentru clasă sau înregistrare este determinat în mod normal Delphi (de exemplu, de la dreapta la stânga în clauza de utilizare a unității).

Ceea ce înseamnă asta 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 folosiți metodele sale introduse - ceea ce în majoritatea cazurilor va fi așa, nu știți ce implementare a asistentului 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 privat funcţie GetTheObject (const un șir: şir): TObject; procedură SetTheObject (const un șir: şir; const Valoare: TObject); public proprietate 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ă ați adăugat obiecte la o listă de șiruri, puteți ghici când să folosiți proprietatea de ajutor de mai sus.