Delphi Class (en Record) Helpers begrijpen

Een functie van de Delphi-taal die enkele jaren geleden is toegevoegd (lang geleden in Delphi 2005) genaamd "Class Helpers" is ontworpen om u nieuwe functionaliteit toe te voegen aan een bestaande klasse (of een record) door nieuwe methoden aan de klasse (record) te introduceren.

Hieronder ziet u nog meer ideeën voor klassenhulpen + leren wanneer en wanneer u klassenhulpen niet mag gebruiken.

Klasse Helper voor...

Met andere woorden, een klassenhelper is een constructie die een klasse uitbreidt door nieuwe methoden in de helperklasse te introduceren. Met een klassehelper kunt u de bestaande klasse uitbreiden zonder deze daadwerkelijk te wijzigen of ervan over te nemen.

Om de TStrings-klasse van de VCL uit te breiden, zou u een klassehelper verklaren en implementeren zoals de volgende:

type
TStringsHelper = klasse helper voor TStrings. openbaarfunctie Bevat (const aString: string): boolean; einde; 

De bovenstaande klasse, "TStringsHelper" genoemd, is een klassehulp voor het type TStrings. Merk op dat TStrings is gedefinieerd in de Classes.pas, een eenheid die standaard beschikbaar is in de gebruiksclausule voor elke

instagram viewer
Delphi vorm eenheid, bijvoorbeeld.

De functie die we toevoegen aan het TStrings-type met behulp van onze klassehelper is "Bevat". De implementatie zou er als volgt uit kunnen zien:

functie TStringsHelper. Bevat (const aString: string): boolean; beginnen
resultaat: = -1 <> IndexOf (aString); einde; 

Ik weet zeker dat je het bovenstaande vaak in je code hebt gebruikt - om te controleren of een TStrings-afstammeling, zoals TStringList, een stringwaarde heeft in zijn Items-verzameling.

Merk op dat bijvoorbeeld de eigenschap Items van een TComboBox of een TListBox is van het type TStrings.

Als de TStringsHelper is geïmplementeerd en een keuzelijst op een formulier (genaamd "ListBox1"), kunt u nu controleren of een bepaalde string deel uitmaakt van de eigenschap Items in de keuzelijst Items met behulp van:

als ListBox1.Items. Bevat ('een string') vervolgens... 

Klasse Helpers Go en NoGo

De implementatie van klassenhulpen heeft een aantal positieve en sommige (u zou kunnen denken) negatieve effecten op uw codering.

Over het algemeen moet je voorkomen dat je je eigen lessen uitbreidt - alsof je een nieuwe functionaliteit moet toevoegen je eigen aangepaste klassen - voeg de nieuwe dingen rechtstreeks toe aan de klasse-implementatie - zonder een klasse te gebruiken helper.

Klassehulpen zijn daarom meer ontworpen om een ​​klasse uit te breiden wanneer u niet kunt (of hoeft te) vertrouwen op normale klasse-overerving en interface-implementaties.

Een klassenhelper kan geen instantiegegevens declareren, zoals nieuwe privévelden (of eigenschappen die dergelijke velden zouden lezen / schrijven). Het toevoegen van nieuwe klassenvelden is toegestaan.

Een klassenhelper kan nieuwe methoden (functie, procedure) toevoegen.

Vóór Delphi XE3 kon je alleen klassen en records uitbreiden - complexe typen. Vanaf Delphi XE 3 release kun je ook simpele types uitbreiden zoals integer of string of TDateTime, en construct hebben zoals:

var
s: string; beginnen
s: = 'Delphi XE3-helpers'; s: = s. UpperCase. Omgekeerde; einde; 

Ik zal in de nabije toekomst over Delphi XE 3 simple type helper schrijven.

Waar is MY Class Helper

Een beperking van het gebruik van klassenhulpen die u kunnen helpen "uzelf in de voet te schieten", is het feit dat u meerdere helpers kunt definiëren en associëren met één type. Er is echter slechts nul of één helper van toepassing op een specifieke locatie in de broncode. De helper die is gedefinieerd in het dichtstbijzijnde bereik is van toepassing. Klasse- of recordhelperbereik wordt normaal bepaald Delphi mode (bijvoorbeeld van rechts naar links in de gebruiksclausule van de eenheid).

Dit betekent dat u twee TStringsHelper-klasse helpers in twee verschillende eenheden kunt definiëren, maar dat er slechts één van toepassing is wanneer ze daadwerkelijk worden gebruikt!

Als een klasse-helper niet is gedefinieerd in de eenheid waar u de geïntroduceerde methoden gebruikt - wat in de meeste gevallen het geval zal zijn, weet u niet welke klasse-helper-implementatie u daadwerkelijk zou gebruiken. Twee klassenhulpen voor TStrings, met een andere naam of in verschillende eenheden, hebben mogelijk een andere implementatie voor de "Bevat" -methode in het bovenstaande voorbeeld.

Gebruik of niet?

Ja, maar let op de mogelijke bijwerkingen.

Hier is nog een handige uitbreiding op de bovengenoemde TStringsHelper-klasse helper


TStringsHelper = klasse helper voor TStrings. privaatfunctie GetTheObject (const een draad: draad): TObject; procedure SetTheObject (const een draad: draad; const Waarde: TObject); openbaareigendom ObjectVoor [const een draad: draad]: TObject lezen GetTheObject schrijven SetTheObject; einde;... functie TStringsHelper. GetTheObject (const een draad: draad): TObject; var
idx: geheel getal; beginnen
resultaat: = nihil; idx: = IndexOf (aString); als idx> -1 vervolgens resultaat: = Objecten [idx]; einde; procedure TStringsHelper. SetTheObject (const een draad: draad; const Waarde: TObject); var
idx: geheel getal; beginnen
idx: = IndexOf (aString); als idx> -1 vervolgens Objecten [idx]: = waarde; einde; 

Als je dat bent geweest objecten toevoegen aan een stringlijstkunt u raden wanneer u de bovenstaande handige helper-eigenschap moet gebruiken.

instagram story viewer