Suprasti „Delphi“ klasės (ir įrašų) pagalbininkus

Delfų kalbos savybė, pridėta prieš kelerius metus (atgal į vidų) 2005 m. „Delphi“), vadinamu „Klasės pagalbininkais“, yra skirtas suteikti jums esamos klasės (ar įrašo) naujų funkcijų, įvedant klasėje (įraše) naujus metodus.

Žemiau pamatysite dar keletą idėjų klasių pagalbininkams + sužinokite, kada ir kada nesinaudoti klasės pagalbininkais.

Klasės pagalbininkas...

Paprastais žodžiais tariant, klasės pagalbininkas yra konstruktas, pratęsiantis klasę, įvedant naujus metodus pagalbininkų klasėje. Klasės pagalbininkas leidžia pratęsti esamą klasę faktiškai jos nekeičiant ar nepaveldėjus.

Norėdami pratęsti VCL TStrings klasę, jūs paskelbtumėte ir įgyvendintumėte klasės pagalbininką taip:

tipo
TStringsHelper = klasės pagalbininkas TStrings. viešaifunkcija Sudėtyje yra (const aString: string): boolean; galas; 

Aukščiau paminėta klasė, vadinama „TStringsHelper“, yra klasės pagalbininkė TStrings tipui. Atminkite, kad „TStrings“ yra apibrėžta „Classes.pas“ - vienete, kuri pagal numatytuosius nustatymus yra bet kurios naudojimo sąlygoje Delfi formos vienetas, pvz.

instagram viewer

Funkcija, kurią pridedame prie „TStrings“ tipo, naudodama mūsų klasės pagalbininką, yra „Yra“. Įdiegimas galėtų atrodyti taip:

funkcija „TStringsHelper“. Sudėtyje yra (const aString: string): boolean; prasideda
rezultatas: = -1 <> IndexOf (aString); galas; 

Esu tikras, kad savo kode esate panaudojęs aukščiau jau kelis kartus - norėdamas patikrinti, ar kai kurių TStrings palikuonių, tokių kaip TStringList, elementų kolekcija turi tam tikrą eilutės vertę.

Atminkite, kad, pavyzdžiui, daiktų nuosavybė a „TComboBox“ arba „TListBox“ yra TStrings tipo.

Įdiegę „TStringsHelper“ ir pateikę formos sąrašo laukelį (pavadintą „ListBox1“), dabar galite patikrinti, ar kokia nors eilutė yra sąrašo laukelio „Elementai“ nuosavybės dalis, naudodamiesi:

jei „ListBox1.Items“. Sudėtyje yra ('eilutė') tada... 

„Class Helpers Go“ ir „NoGo“

Klasių pagalbininkų įgyvendinimas turi teigiamą ir tam tikrą (jūs galite pagalvoti) neigiamą poveikį jūsų kodavimui.

Apskritai turėtumėte vengti pratęsti savo užsiėmimus - tarsi jums reikėtų pridėti šiek tiek naujų funkcijų savo pasirinktines klases - pridėkite naujų dalykų klasės įgyvendinime tiesiogiai - nenaudokite klasės pagalbininkas.

Taigi klasės pagalbininkai yra labiau skirti pratęsti klasę, kai negalite (arba nereikia) pasikliauti įprastu klasės paveldėjimu ir sąsajos įgyvendinimu.

Klasės pagalbininkas negali deklaruoti egzempliorių duomenų, pavyzdžiui, naujų privačių laukų (arba ypatybių, kurios galėtų skaityti / rašyti tokius laukus). Pridėta naujų klasės laukų leidžiama.

Klasės pagalbininkas gali pridėti naujų metodų (funkcija, procedūra).

Prieš „Delphi XE3“ galėjote išplėsti tik klases ir įrašus - sudėtingus tipus. Iš „Delphi XE 3“ leidimo taip pat galite išplėsti paprastus tipus, tokius kaip sveikasis skaičius arba eilutė ar „TDateTime“, ir kurti tokius:

var
s: styga; prasideda
s: = 'Delphi XE3 pagalbininkai'; s: = s. „UpperCase“. Atvirkštinė; galas; 

Artimiausiu metu parašysiu apie „Delphi XE 3“ paprasto tipo pagalbininką.

Kur yra mano klasės pagalbininkas

Vienas klasės pagalbininkų, galinčių padėti „nušauti sau koją“, apribojimas yra tas, kad galite apibrėžti ir susieti kelis pagalbininkus su vienu tipu. Tačiau bet kurioje konkrečioje šaltinio kodo vietoje galioja tik nulis arba vienas pagalbininkas. Bus taikomas artimiausioje srityje apibrėžtas pagalbininkas. Klasės ar rekordininko pagalbininkų apimtis nustatoma normaliai Delfi mada (pavyzdžiui, vieneto naudojimo sąlygoje iš dešinės į kairę).

Tai reiškia, kad jūs galite apibrėžti du „TStringsHelper“ klasės pagalbininkus dviem skirtingais vienetais, tačiau realiai juos naudojant bus taikomas tik vienas!

Jei klasės pagalbininkas nėra apibrėžtas vienete, kuriame naudojate jo įvestus metodus - kurie dažniausiai bus tokie, jūs nežinote, kokį klasės pagalbininko įgyvendinimą iš tikrųjų naudosite. Du aukščiau pateiktame pavyzdyje pateikiami du „TStrings“ klasės pagalbininkai, pavadinti skirtingai arba gyvenantys skirtinguose vienetuose.

Naudoti ar ne?

Taip, bet žinokite apie galimą šalutinį poveikį.

Čia yra dar vienas patogus minėtų „TStringsHelper“ klasės pagalbininkų pratęsimas


TStringsHelper = klasės pagalbininkas TStrings. privatusfunkcija „GetTheObject“ (const „aString“: stygos): TObject; procedūra „SetTheObject“ (const „aString“: stygos; const Vertė: TObject); viešainuosavybė ObjectFor [const „aString“: stygos]: TObject skaityti „GetTheObject“ rašyti „SetTheObject“; galas;... funkcija „TStringsHelper“. „GetTheObject“ (const „aString“: stygos): TObject; var
idx: sveikasis skaičius; prasideda
rezultatas: = nulis; idx: = IndexOf (aString); jei idx> -1 tada rezultatas: = objektai [idx]; galas; procedūra „TStringsHelper“. „SetTheObject“ (const „aString“: stygos; const Vertė: TObject); var
idx: sveikasis skaičius; prasideda
idx: = IndexOf (aString); jei idx> -1 tada Objektai [idx]: = reikšmė; galas; 

Jei buvai objektų įtraukimas į stygų sąrašą, galite atspėti, kada naudoti aukščiau pateiktą patogaus pagalbininko nuosavybę.