Kennisbank

Delphi interfaces en collections

Introduction – Delphi interfaces en collections

Bij GDK werken we voortdurend met geavanceerde tools en technieken. Dat betekent dat we ook zelf up-to-date moeten blijven! Dit doen we door middel van kennissessies waarin we verschillende onderwerpen bespreken. Onze laatste sessie ging over Delphi interfaces en collections.

 

Waarom zou je interfaces gebruiken in Delphi??

Ten eerste: Een interface biedt een contract om mee te praten als we werken met objecten die het implementeren. Daardoor hoeven we ons geen zorgen te maken over de implementatiedetails van dat object (vanuit het perspectief van de aanroepende code). Het is een van de beste voorbeelden van de Solid principes.

Ten tweede: in Delphi gebruiken we ze om geheugenlekken te voorkomen door gebruik te maken van het reference counting. Als een interface buiten scope raakt en het was de laatste referentie naar het object waarnaar het verwees, dan wordt het automatisch verwijderd.

Delphi Collections

Collecties zijn al sinds het begin van Delphi geïmplementeerd. We kunnen kiezen uit TLists voor pointers, TObjectList voor objecten (die eigendom kunnen zijn van de lijst; erg handig), TStringList enz. Hoewel deze collecties erg handig zijn, hebben ze enkele beperkingen. Als je ze gebruikt, moet je altijd casten om het juiste datatype uit de lijst te halen. Dit maakt de code ook gevoelig voor fouten, omdat de compiler niet klaagt als een object wordt gecast naar een andere klasse dan het in werkelijkheid is. Daar kom je pas tijdens de runtime achter.

MyObject := TMyType(MyList[0]);

 

Generics Collections

Om het hele casting-probleem te omzeilen en de code leesbaarder te maken is in Delphi 2009 de Generics Collections toegevoegd. Daardoor kunnen we nu het datatype specificeren dat in de collectie zit die we gebruiken. Dit doen we door het datatype tussen haakjes te specificeren. Nu weet de compiler wat er in de collectie komt en de kans op casting naar de verkeerde klasse is nu geminimaliseerd.

Het is zelfs mogelijk om interfaces als parametertype te gebruiken. Dit geldt voor alle collectie-implementaties, behalve voor de TObjectList. Deze klasse heeft een type nodig dat uitbreidt van TObject.

MyList := TList<TMyType>.Create;
MyList.Add(MyObject);

MyOtherObject := MyList[0];

 

Spring – Collections and Interfaces

Het beste van twee werelden! Nu kunnen we onze favoriete interfaces samen met collections gebruiken en alle voordelen van het gebruik van interfaces benutten. Het enige wat we nog missen is het feit dat de Generics Collections objecten zelf geen interface implementeren.

Het Spring4D framework biedt (naast andere zeer handige klassen) precies dat: lijsten waarnaar verwezen wordt met behulp van interfaces. En meer: omdat de Spring4D verzamelklassen vanaf de grond zijn opgebouwd, voorzien ze in een heleboel handige functies die niet beschikbaar zijn in het Generics Collections framework. Bekijk de Spring4D documentatie om daar achter te komen.

MyTypedObject := TMyType.Create);

MyList := TCollections.CreateList<IMyType>;
MyList.Add(MyTypedObject);

 

Conclusie

Door het gebruik van Generics Collections in combinatie met interfaces zorgen we er automatisch voor dat onze code minder gevoelig is voor fouten. Dat komt omdat we de compiler laten weten wat er in de verzamelingen zit die we gebruiken, zodat hij kan controleren op eventuele fouten.

Wat we ten zeerste aanbevelen is het gebruik van het Spring4D framework voor alle handige functionaliteit die het ons biedt bij het werken met verzamelingen! Bekijk ons Youtube kanaal voor alle video’s over Spring4D: https://youtube.com/@GDKSoftware

Geschreven door Johnny Nap
Delphi ontwikkelaar

Contact

Laat ons helpen jouw ambities concreet te maken.