Porozumění pomocníkům třídy Delphi (a záznamu)

click fraud protection

Funkce jazyka Delphi přidaná před několika lety (cesta zpět do v Delphi 2005) s názvem „Class Helpers“ je navržen tak, aby vám umožnil přidat nové funkce do stávající třídy (nebo záznamu) zavedením nových metod do třídy (záznamu).

Níže uvidíte několik dalších nápadů pro pomocníky třídy + dozvědět se, kdy a kdy nepoužívat pomocníky třídy.

Pomocník třídy pro...

Jednoduše řečeno, pomocník třídy je konstrukt, který rozšiřuje třídu zavedením nových metod do třídy pomocníka. Pomocník třídy vám umožní rozšířit existující třídu, aniž by ji skutečně modifikoval nebo zdědil.

Chcete-li rozšířit třídu TStrings VCL, deklarujte a implementujte pomocníka třídy, jako je následující:

typ
TStringsHelper = třídní pomocník pro TStrings. veřejnostfunkce Obsahuje (konst aString: string): boolean; konec; 

Výše uvedená třída s názvem "TStringsHelper" je pomocník třídy pro typ TStrings. Všimněte si, že TStrings je definován v Classes.pas, jednotce, která je ve výchozím nastavení dostupná v klauzuli použití pro všechny Delphi například formulářová jednotka.

instagram viewer

Funkce, kterou přidáváme do typu TStrings pomocí našeho pomocníka třídy, je „Obsahuje“. Implementace by mohla vypadat takto:

funkce TStringsHelper. Obsahuje (konst aString: string): boolean; začít
výsledek: = -1 <> IndexOf (aString); konec; 

Jsem si jist, že jste v kódu použili výše uvedené možnosti mnohokrát - abyste zkontrolovali, zda některý potomek TStrings, například TStringList, má ve své kolekci Položky nějakou hodnotu řetězce.

Všimněte si, že například vlastnost Položky a TComboBox nebo TListBox je typu TStrings.

Po implementaci TStringsHelper a seznamu ve formuláři (nazvaném „ListBox1“) můžete nyní zkontrolovat, zda je nějaký řetězec součástí vlastnosti seznamu v seznamu Položky pomocí:

-li ListBox1.Items. Obsahuje ('nějaký řetězec') pak... 

Pomocníci třídy jdou a NoGo

Implementace pomocníků třídy má některé pozitivní a některé (možná si myslíte) negativní dopady na vaše kódování.

Obecně byste se měli vyhnout rozšiřování svých vlastních tříd - jako byste do nich měli přidat nějaké nové funkce své vlastní třídy - přidejte nové věci přímo do implementace třídy - nepoužívejte třídu pomocník.

Pomocníci třídy jsou proto navrženi tak, aby rozšířili třídu, když se nemůžete (nebo nemusíte) spolehnout na implementaci normálního dědictví třídy a implementaci rozhraní.

Pomocník třídy nemůže deklarovat data instance, například nová soukromá pole (nebo vlastnosti, které by taková pole čítala / zapisovala). Přidávání nových polí třídy je povoleno.

Pomocník třídy může přidat nové metody (funkce, postup).

Před Delphi XE3 jste mohli rozšiřovat pouze třídy a záznamy - složité typy. Z vydání Delphi XE 3 můžete také rozšířit jednoduché typy, jako je celé číslo nebo řetězec nebo TDateTime, a mít konstrukci jako:

var
s: string; začít
s: = 'Pomocníci Delphi XE3'; s: = s. UpperCase. Zvrátit; konec; 

V blízké budoucnosti budu psát o pomocníkovi typu Delphi XE 3.

Kde je pomocník třídy MY

Jedním omezením použití třídních pomocníků, které by vám mohlo pomoci „střílet se do nohy“, je skutečnost, že můžete definovat a přiřadit více pomocníků k jednomu typu. Ve zdrojovém kódu se však na jakémkoli konkrétním místě vztahuje pouze nula nebo jeden pomocník. Použije se pomocník definovaný v nejbližším rozsahu. Rozsah pomocníka třídy nebo záznamu je stanoven normálně Delphi móda (například zprava doleva v klauzuli o použití jednotky).

To znamená, že můžete definovat dva pomocníky třídy TStringsHelper ve dvou různých jednotkách, ale pouze jedna bude platit, když bude skutečně použita!

Pokud pomocník třídy není definován v jednotce, kde používáte jeho zavedené metody - což ve většině případů tak bude, nevíte, jakou implementaci pomocníka třídy byste skutečně použili. Dva pomocníci třídy pro TStrings, pojmenované odlišně nebo s bydlištěm v různých jednotkách, mohou mít pro implementaci metody „Obsahuje“ ve výše uvedeném příkladu jinou implementaci.

Použijte nebo ne?

Ano, ale uvědomte si možné nežádoucí účinky.

Zde je další užitečné rozšíření výše uvedeného pomocníka třídy TStringsHelper


TStringsHelper = třídní pomocník pro TStrings. soukroméfunkce GetTheObject (konst řetězec: tětiva): TObject; postup SetTheObject (konst řetězec: tětiva; konst Hodnota: TObject); veřejnostvlastnictví ObjectFor [konst řetězec: tětiva]: TObject číst GetTheObject napsat SetTheObject; konec;... funkce TStringsHelper. GetTheObject (konst řetězec: tětiva): TObject; var
idx: celé číslo; začít
výsledek: = nula; idx: = IndexOf (aString); -li idx> -1 pak result: = Objects [idx]; konec; postup TStringsHelper. SetTheObject (konst řetězec: tětiva; konst Hodnota: TObject); var
idx: celé číslo; začít
idx: = IndexOf (aString); -li idx> -1 pak Objekty [idx]: = Hodnota; konec; 

Pokud jste byli přidání objektů do seznamu řetězců, můžete hádat, kdy použít výše uvedenou užitečnou pomocnou vlastnost.

instagram story viewer