A Delphi osztály segítőinek megértése

A delphi nyelv jellemzője, amelyet néhány évvel ezelőtt adtak hozzá (visszafelé Delphi 2005-ben), az úgynevezett "Osztálysegítők" célja, hogy új funkciókat adjon egy meglévő osztályhoz (vagy rekordhoz) az új módszerek bevezetésével az osztályba (rekordba).

Az alábbiakban további ötleteket láthat az osztálysegítők számára + megtudhatja, mikor és mikor nem használhatja az osztálysegédeket.

Osztálysegéd...

Egyszerű szavakkal: az osztálysegéd olyan konstrukció, amely kibővíti az osztályt, új módszerek bevezetésével a segítőosztályban. Az osztálysegéd lehetővé teszi a meglévő osztály kibővítését anélkül, hogy azt ténylegesen megváltoztatná, vagy öröklné.

A VCL TStrings osztályának kibővítéséhez az alábbi segítőt kell bejelentenie és végrehajtania:

típus
TStringsHelper = osztály segítő TStrings. nyilvánosfunkció tartalmaz (const aString: string): logikai; vég; 

A fenti osztály, az úgynevezett "TStringsHelper" egy osztálysegéd a TStrings típushoz. Ne feledje, hogy a TStrings a Classes.pas-ban van meghatározva, amely egység alapértelmezés szerint rendelkezésre áll bármely felhasználási záradékban

instagram viewer
Delphi például az űrlapegység.

A TStrings típushoz az osztálysegédünkkel hozzáadott funkció "Tartalmaz". A megvalósítás így nézhet ki:

funkció TStringsHelper. tartalmaz (const aString: string): logikai; kezdődik
eredmény: = -1 vég; 

Biztos vagyok abban, hogy a fentieket sokszor használta a kódjában - annak ellenőrzésére, hogy egyes TStrings leszármazottak, mint például a TStringList, tartalmaz-e karakterláncértéket a tételek gyűjteményében.

Vegye figyelembe, hogy például a TComboBox vagy a TListBox TStrings típusú.

A TStringsHelper megvalósítása és az űrlapon található listamező („ListaBox1” elnevezésű) mezője segítségével most ellenőrizheti, hogy valamelyik karakterlánc része-e a tételek tulajdonságainak a következő felhasználásával:

ha ListBox1.Items. Tartalmaz ('valamilyen karakterlánc') azután... 

Class Helpers Go és NoGo

Az osztálysegédek alkalmazása pozitív és némi (gondolkodhat) negatív hatással lehet a kódolásra.

Általában el kell kerülni a saját osztályainak kiterjesztését - mintha új funkciókat kellene hozzáadnia saját egyéni osztályai - az új dolgokat közvetlenül hozzáadhatja az osztály implementációjához - osztály használata nélkül segítő.

Az osztálysegédeket ezért inkább az osztály kibővítésére tervezték, amikor nem (vagy nem kell támaszkodni) a szokásos osztály öröklésre és az interfész megvalósítására.

Az osztálysegéd nem deklarálhat példányadatokat, mint például az új privát mezők (vagy tulajdonságok, amelyek ezeket a mezőket olvasnák / írnák). Új osztálymezők hozzáadása megengedett.

Az osztálysegéd új módszereket (funkció, eljárás) adhat hozzá.

A Delphi XE3 előtt csak osztályokat és rekordokat lehetett kiterjeszteni - komplex típusokat. A Delphi XE 3 kiadásából egyszerű típusokat is kibővíthet, például egész szám vagy karakterlánc vagy TDateTime, és ehhez hasonlóan építhet:

var
s: húr; kezdődik
s: = 'Delphi XE3 segítők'; s: = s. Nagybetűs. Fordított; vég; 

A Delphi XE 3 egyszerű típusú helperről írok a közeljövőben.

Hol van az én osztályos segítőm?

Az osztálysegédek használatának egyik korlátozása, amely segíthet „lábbal lőni magát”, az a tény, hogy több segítőt definiálhat és társíthat egyetlen típushoz. A forráskód bármely meghatározott helyére azonban csak nulla vagy egy segítő vonatkozik. A legközelebbi hatókörben meghatározott segítő alkalmazandó. Az osztály vagy rekord segítő hatókörét a normál esetben kell meghatározni Delphi divat (például jobbról balra az egység használati záradékában).

Ez azt jelenti, hogy definiálhat két TStringsHelper osztályú segítőt két különböző egységben, de valójában csak egy alkalmazható!

Ha az osztálysegéd nincs meghatározva abban az egységben, amelyben a bevezetett módszereket használja - ami a legtöbb esetben így lesz, akkor nem tudja, milyen osztálysegéd megvalósítást valósítana meg. A TStrings két osztályának segítője, más néven vagy különféle egységekben helyezkedik el, a fenti példában szereplő "Tartalmaz" módszer esetében eltérő lehet.

Használja vagy nem?

Igen, de tisztában kell lennie a lehetséges mellékhatásokkal.

Itt egy újabb praktikus kiterjesztés a fent említett TStringsHelper osztálysegédhez


TStringsHelper = osztály segítő TStrings. magánfunkció GetTheObject (const húr: húr): TObject; eljárás SetTheObject (const húr: húr; const Érték: TObject); nyilvánosingatlan ObjectFor [const húr: húr]: Tárgy olvas GetTheObject ír SetTheObject; vég;... funkció TStringsHelper. GetTheObject (const húr: húr): TObject; var
idx: egész szám; kezdődik
eredmény: = nulla; idx: = IndexOf (aString); ha idx> -1 azután eredmény: = Objektumok [idx]; vég; eljárás TStringsHelper. SetTheObject (const húr: húr; const Érték: TObject); var
idx: egész szám; kezdődik
idx: = IndexOf (aString); ha idx> -1 azután Objektumok [idx]: = Érték; vég; 

Ha már voltál objektumok hozzáadása egy karakterlánc-listához, kitalálhatja, mikor kell használni a fenti praktikus segítő tulajdonságot.

instagram story viewer