Wenn Sie polymorphe Listen benötigen, sind Generics eher ein Hindernis als eine Hilfe. Dies kompiliert nicht einmal, da Sie beispielsweise keine TDogList verwenden können, wenn eine TAnimalList erforderlich ist:
uses
Generics.Collections;
type
TAnimal = class
end;
TDog = class(TAnimal)
end;
TAnimalList = TList;
TDogList = TList;
procedure FeedTheAnimals(const aList: TAnimalList);
begin
// Blah blah blah
end;
var
dogs: TDogList;
begin
dogs := TDogList.Create;
try
FeedTheAnimals(dogs);
finally
dogs.Free;
end;
end;
Die Gründe hierfür sind recht klar und leicht zu erklären, aber genauso unlogisch.
Meine eigene Ansicht ist, dass Sie ein paar Sekunden oder Minuten (wenn Sie ein langsamer Tipper sind) sparen können, indem Sie ein generisches Container anstelle eines spezifischeren und geeigneteren Containers erstellen, der Ihren Anforderungen entspricht. Allerdings könnten Sie am Ende mehr Zeit damit verbringen, Probleme und Einschränkungen von Generics zu umgehen, als Sie anfangs gespart haben (und per Definition, wenn Sie bis jetzt keine generischen Container verwendet haben, wissen Sie nicht, welche Probleme/Einschränkungen auftreten können, bis Sie darauf stoßen).
Wenn ich eine TAnimalList benötige, dann besteht die Möglichkeit, dass ich zusätzliche TAnimal-spezifische Methoden auf dieser Listenklasse benötige oder davon profitieren könnte, die ich gerne in einem TDogList erben würde, was wiederum zusätzliche spezifische Elemente einführen könnte, die für seine TDog-Elemente relevant sind.
(Tier und Hund werden nur zu illustrativen Zwecken verwendet, natürlich. Ich arbeite derzeit nicht an Tierarztcode - LOL)
Das Problem ist, dass man das nicht immer von Anfang an weiß.
Defensive Programmierprinzipien legen (für mich, ymmv) nahe, dass es wahrscheinlich teuer werden wird, wenn man sich für ein bisschen Zeitersparnis in die Ecke drängt. Und wenn nicht, ist der zusätzliche "Preis" dafür, die anfängliche Ersparnis nicht zu nutzen, vernachlässigbar.
- Außerdem ist Ihr Code mit Benutzern älterer Delphi-Versionen besser teilbar, wenn Sie so großzügig sind.
)