Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Parametisierter Typecast
Bergmann89 - Do 03.03.11 23:35
Titel: Parametisierter Typecast
Hey,
ich schreib gerade an einer Anwendung, bei der ich viele Instanzen von verschiedenen Objekten in je einer Liste verwalten muss/will. Da mein D7 aber noch keine typisierten Listen kann, und ich nit jedesmal day TObjekt casten will, welches mit die TObjectList zurückgibt, wollte ich mir eigene Klassen schreiben, die von TObjectList abgeleitet sind. Da schreib ich aber auch irgendwie immer das gleiche, nur das ich da nen anderen Typcast drin hab. Also hatte ich folgende Idee:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function TMyList.Get(Index: Integer): TMyType; var ClassType: TClass; begin ClassType := TMyType; result := (fList[Index] as ClassType); end; |
das funktioniert aber leider nicht. Gibt es eine Möglichkeit, das so ähnlich zu realisieren? Weil dann kann ich eine Klasse für die Liste schreiben, in der alle abgeleiteten Klassen einfach den gespeicherten Typ in einer Variable speichern und der Cast erfolgt dann einfach wieder über die Superklasse.
€: ich glaub ich hab da grad nen Denkfehler drin. ich muss ja bei der Methode trotzdem noch den Typ des Rückgabewertes angeben -.- Warum kann D7 noch keine typisierten Listen :(
MfG Bergmann.
Bergmann89 - Fr 04.03.11 00:04
Ah super, das funktioniert. Jetzt hab ich aber alle meine Liste in einer Klasse. Und er meckert rum, wenn ich _TObjectListItem nochmal definieren will (is ja klar). Kann ich das auch noch irgendwie umgehen oder muss ich pro Liste eine eigene Unit anlegen?
€: OK habs alles in Units ausgelagert. Ich hab zwar jetzt ca. 10 Units wo nur sowas drin steht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| unit uglslFunctionList;
interface
uses Classes, uglslObjects, uUtils, Contnrs, uglslFunction;
type TglslObjectListItem = TglslFunction; {$I glslObjectListTemplate.pas} TglslFunctionList = class(TglslObjectlist) end;
implementation
{$I glslObjectListTemplate.pas}
end. |
aber es ist trotzdem wesentlich übersichtlicher und platzsparender als vorher. Nochma Danke :)
MfG Bergmann.
jaenicke - Fr 04.03.11 06:35
Eigene Units sind am sinnvollsten, ja. Ich selbst habe eine Template-Datei, die mehrere typisierte Listen unterstützt, gebastelt. (Und auch mehr Methoden von TObjectList überschreibt.)
Das geht, indem du ein zusätzliche defines einführst, mit denen du unterscheidest welche Liste gerade eingebunden werden soll. In der Template-Datei sieht es dann aber aus wie Kraut und Rüben. :lol:
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5:
| {$ifdef ObjectList1}TTypedObjectListTemplate1 {$else}{$ifdef ObjectList2}TTypedObjectListTemplate2 {$else}{$ifdef ObjectList3}TTypedObjectListTemplate3 {$else}{$ifdef ObjectList4}TTypedObjectListTemplate4 {$else}TTypedObjectListTemplate{$endif}{$endif}{$endif}{$endif} = class; |
Dazu habe ich dann noch solche Sachen gemacht wie Standardroutinen wie Disconnect oder so bei allen aufzurufen, wenn es das gibt. Alles über zusätzliche Defines.
Bergmann89 - Fr 04.03.11 06:41
:shock: Okay, da bleib ich lieber bei mehreren Units. Bischen Code kommt ja bei den abgeleiteten Klassen noch dazu, also sieht es nich mehr ganz so leer aus ^^
MfG Bergmann
jaenicke - Fr 04.03.11 07:22
Nebenbei ist das Schöne, dass du das dann nahtlos mit echten typisierten Listen verwenden kannst später.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| {$ifdef DELPHI2009_OR_HIGHER} TMyBeautifulList = TObjectList<TMyBeautifulClass>; {$else} _TObjectListItem = TMyBeautifulClass; {$I templateTListU.pas} TMyBeautifulList = class(_TObjectList) {$endif} private public end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!