In this first developer-themed post, I am going to describe some basic stuff, before I delve into some real-world applications.
Delphi 2009 brought Generics to the Delphi-World. And since then, they are found in all of my Applications. Especially Generics.Collections are heavily used by me.
Before Generics.Collections I had to implement a TList for each Class I would like to store a variable amount of Objects. (Or I could use Contnrs.TObjectList and cast to TAnimal everytime I need one, but I don't find that very desirable)
And this is just for TAnimal, if there are any other classes, I would have to copy&paste the code for the List and replace the data types.
With Generics.Collections the same thing looks like this:
And I don't even need the alias "TAnimalList", I could use "TList<TAnimal>" instead.
Also, it is not limited to Classes, it can hold every datatype like integer, double, boolean and even records. In my case it is even better to use TObjectList<TAnimal>, which automatically frees its containing objects if it is freed.
Since all the Generics.Collectionshave an Enumerator the following is possible:
Generics.Collections has more then some simple Lists up its sleeve. There are also TQueue, which uses FIFO and TStack which uses LIFO to store its contents.
TDictionary is a little different, because its taking two type parameters. One for the key, one for the Value.
A case that I often stumble upon is to store (and recieve) some object or value for a specific string. And then I always use a TDictionary<String,TValue>
There's also a TObjectDictionary, which takes care of memory of the keys, the values or even both.
That's it for today.
Delphi 2009 brought Generics to the Delphi-World. And since then, they are found in all of my Applications. Especially Generics.Collections are heavily used by me.
Before Generics.Collections I had to implement a TList for each Class I would like to store a variable amount of Objects. (Or I could use Contnrs.TObjectList and cast to TAnimal everytime I need one, but I don't find that very desirable)
interface uses Classes; type TAnimal = class private fName : string; public property Name : string read fName write fName; end; TAnimalList = class (TList) private procedure putAnimal(Index : integer; Value : TAnimal); function getAnimal(Index : integer) : TAnimal; public property Items [Index : integer] : TAnimal read getAnimal write setAnimal; end; implementation procedure TAnimalList.putAnimal(Index : integer; Value : TAnimal); begin inherited put(Index, Value); end; function TAnimalList.getAnimal(Index : integer) : TAnimal; begin result := (TAnimal) inherited get(Index); end;
And this is just for TAnimal, if there are any other classes, I would have to copy&paste the code for the List and replace the data types.
With Generics.Collections the same thing looks like this:
interface uses Generics.Collections; type TAnimal = class private fName : string; public property Name : string read fName write fName; end; TAnimalList = TList<TAnimal>
And I don't even need the alias "TAnimalList", I could use "TList<TAnimal>" instead.
Also, it is not limited to Classes, it can hold every datatype like integer, double, boolean and even records. In my case it is even better to use TObjectList<TAnimal>, which automatically frees its containing objects if it is freed.
Since all the Generics.Collectionshave an Enumerator the following is possible:
var fAnimals : TList<TAnimal> procedure init; var a : TAnimal; begin for a in fAnimals do begin a.DoSomething; end; end;
Generics.Collections has more then some simple Lists up its sleeve. There are also TQueue, which uses FIFO and TStack which uses LIFO to store its contents.
TDictionary is a little different, because its taking two type parameters. One for the key, one for the Value.
A case that I often stumble upon is to store (and recieve) some object or value for a specific string. And then I always use a TDictionary<String,TValue>
There's also a TObjectDictionary, which takes care of memory of the keys, the values or even both.
procedure init; var ownsKeys, ownsValues, ownsBoth : TObjectDictionary<TKey, TValue> begin ownsKeys := TObjectDictionary<TKey, TValue>.Create([doKeys]); ownsValues := TObjectDictionary<TKey, TValue>.Create([doValues]); ownsBoth := TObjectDictionary<TKey, TValue>.Create([doKeys, doValues]); end;
That's it for today.
Keine Kommentare:
Kommentar veröffentlichen