Una caratteristica del linguaggio Delphi aggiunta alcuni anni fa (ritorno a Delfi 2005) chiamato "Class Helpers" è progettato per consentire di aggiungere nuove funzionalità a una classe (o record) esistente introducendo nuovi metodi nella classe (record).
Di seguito troverai altre idee per gli aiutanti di classe + impara quando e quando non usare gli aiutanti di classe.
Assistente di classe per...
In parole semplici, un helper di classe è un costrutto che estende una classe introducendo nuovi metodi nella classe helper. Un helper di classe ti consente di estendere la classe esistente senza modificarla o ereditarla.
Per estendere la classe TStrings di VCL devi dichiarare e implementare un helper di classe come il seguente:
genere
TStringsHelper = aiutante di classe per TStrings. pubblicofunzione contiene (const aString: string): booleano; fine;
La classe sopra, chiamata "TStringsHelper" è un aiuto di classe per il tipo TStrings. Si noti che TStrings è definito in Classes.pas, un'unità che è disponibile per impostazione predefinita nella clausola use per qualsiasi
Delphi unità del modulo, ad esempio.La funzione che stiamo aggiungendo al tipo TStrings usando il nostro helper di classe è "Contiene". L'implementazione potrebbe apparire come:
funzione TStringsHelper. contiene (const aString: string): booleano; inizio
risultato: = -1 <> IndexOf (aString); fine;
Sono certo che hai usato più volte quanto sopra nel tuo codice - per verificare se alcuni discendenti di TStrings, come TStringList, hanno un valore di stringa nella sua raccolta Items.
Si noti che, ad esempio, la proprietà Items di a TComboBox oppure un TListBox è del tipo TStrings.
Avendo implementato TStringsHelper e una casella di riepilogo in un modulo (denominato "ListBox1"), è ora possibile verificare se una stringa fa parte della proprietà Items della casella di riepilogo utilizzando:
Se ListBox1.Items. Contiene ('alcune stringhe') poi...
Class Helpers Go e NoGo
L'implementazione degli helper di classe ha alcuni impatti positivi e (si potrebbe pensare) negativi sulla codifica.
In generale, dovresti evitare di estendere le tue classi, come se fosse necessario aggiungere alcune nuove funzionalità le tue classi personalizzate - aggiungi direttamente le nuove cose nell'implementazione della classe - non usando una classe aiutante.
Gli helper di classe sono quindi più progettati per estendere una classe quando non è possibile (o non è necessario fare affidamento) sulla normale eredità di classe e sulle implementazioni dell'interfaccia.
Un helper di classe non può dichiarare i dati di istanza, come i nuovi campi privati (o proprietà che potrebbero leggere / scrivere tali campi). L'aggiunta di nuovi campi di classe è consentita.
Un aiutante di classe può aggiungere nuovi metodi (funzione, procedura).
Prima di Delphi XE3 era possibile estendere solo classi e record - tipi complessi. Dalla versione Delphi XE 3 puoi anche estendere tipi semplici come numero intero o stringa o TDateTime, e avere un costrutto come:
var
s: stringa; inizio
s: = "Delphi XE3 helpers"; s: = s. Maiuscolo. Inverso; fine;
Scriverò su Delphi XE 3 helper di tipo semplice nel prossimo futuro.
Dov'è il mio aiutante di classe
Una limitazione all'utilizzo di helper di classe che potrebbe aiutarti a "spararti ai piedi" è il fatto che puoi definire e associare più helper con un solo tipo. Tuttavia, solo zero o un helper si applica in qualsiasi posizione specifica nel codice sorgente. Verrà applicato l'helper definito nell'ambito più vicino. L'ambito dell'helper di classe o record è determinato nel normale Delphi fashion (ad esempio, da destra a sinistra nella clausola usi dell'unità).
Ciò significa che potresti definire due helper di classe TStringsHelper in due unità diverse, ma ne verrà applicato solo uno quando verrà effettivamente utilizzato!
Se un helper di classe non è definito nell'unità in cui si utilizzano i metodi introdotti, cosa che nella maggior parte dei casi sarà tale, non si conosce quale implementazione di helper di classe si utilizzerebbe effettivamente. Gli helper di due classi per TString, denominati in modo diverso o residenti in unità diverse potrebbero avere un'implementazione diversa per il metodo "Contiene" nell'esempio precedente.
Usa o no?
Sì, ma fai attenzione ai possibili effetti collaterali.
Ecco un'altra utile estensione dell'helper di classe TStringsHelper sopra menzionato
TStringsHelper = aiutante di classe per TStrings. privatofunzione GetTheObject (const una stringa: corda): TObject; procedura SetTheObject (const una stringa: corda; const Valore: TObject); pubblicoproprietà ObjectFor [const una stringa: corda]: TObject leggere GetTheObject Scrivi SetTheObject; fine;... funzione TStringsHelper. GetTheObject (const una stringa: corda): TObject; var
idx: intero; inizio
risultato: = zero; idx: = IndexOf (aString); Se idx> -1 poi risultato: = Oggetti [idx]; fine; procedura TStringsHelper. SetTheObject (const una stringa: corda; const Valore: TObject); var
idx: intero; inizio
idx: = IndexOf (aString); Se idx> -1 poi Oggetti [idx]: = Value; fine;
Se lo sei stato aggiunta di oggetti a un elenco di stringhe, puoi indovinare quando utilizzare la proprietà helper sopra indicata.