![]() |
Delphi-Version: 5
Generics Struktur-/Typen-Problem
Guten Tag,
ich habe hier ein strukturelles Problem:
Delphi-Quellcode:
Das Problem kriege ich aber beim Erstellen, wo ich ja die Generische Kette runter alles in Abhaengigkeit von entweder TBall oder TKartoffel generiere:
type
TRundesObjekt = class Radius: Integer; Beschreibung: String; procedure Kollidieren; virtual; abstract; End; TBall = class(TRundesObjekt) AnzahlDerNaehte: Integer; procedure Kollidieren; override; End; TKartoffel = class(TRundesObjekt) MitSchale: Boolean; procedure Kollidieren; override; End; TSack<T: TRundesObjekt> = class Material: String; Inhalt: TArray<T>; procedure Leeren; End; TSackFuellerModel<T: TRundesObjekt> = class MSack: TSack<T>; End; TSackFuellerAdapter<T: TRundesObjekt> = class private Model: TSackFuellerModel<T>; End; implementation procedure TSack<T>.Leeren; begin SetLength(Inhalt, 0); end; procedure TBall.Kollidieren; begin DoSoftMagic(); end; procedure TKartoffel.Kollidieren; begin DoHardMagic(); end;
Delphi-Quellcode:
-> Inkompatible Typen: SackFueller.TSackFuellerAdapter<TRundesObjekt> und SackFueller.TSackFuellAdapter<TBall>
SackFuellerAdapter := TSackFuellerAdapter<TBall>.Create;
Wenn ich mit
Delphi-Quellcode:
erstelle, ist es doch gar nicht spezifiziert auf TBall oder TKartoffel?
SackFuellerAdapter := TSackFuellerAdapter<TRundesObjekt>.Create;
Irgendwie denke ich da gerade falsch. Es muss sich doch alles aufgrund des angegebenen Typen einstellen, daher sollte ich ihn beim obersten Create doch explizit angeben, oder wie/wo soll sich sonst ergeben, welche jeweiligen Versionen (TBall- oder TKartoffel-Prozeduren etc.) dann verwendet werden? Danke fuers Lesen. |
AW: Generics Struktur-/Typen-Problem
Delphi-Quellcode:
mit Sahne oben drauf:
SackFuellerAdapter: TSackFuellerAdapter<TRundesObjekt>;
ändern zu SackFuellerAdapter: TSackFuellerAdapter<TBall>; ändern zu SackFuellerBallAdapter: TSackFuellerAdapter<TBall>;
Delphi-Quellcode:
type
TSackFuellerBallAdapter = TSackFuellerAdapter<TBall>; var SackFuellerAdapter: TSackFuellerBallAdapter; ... begin SackFuellerAdapter := TSackFuellerBallAdapter.Create; end; |
AW: Generics Struktur-/Typen-Problem
Hm, Danke.
Gibt es irgendeine Moeglichkeit, das gleiche Objekt bedarfsweise mit beidem zu beschalten? Bei Deiner Loesung muss ich ja bei der Variablen-Deklaration von SackFuellerAdapter schon mit angeben, um was es sich handelt. Ich hatte gehofft, ich koennte das bis zum Create() offen lassen, so dass man auf allgemeingueltige Elemente auch Zugriff hat, ohne an jeder Stelle eine Weiche zu basteln:
Delphi-Quellcode:
Das wollte ich mir eigentlich durchgaengig ersparen
if Gegebenheit1 then
SackFuellerBallAdapter.Abfuellen else if Gegebenheit2 then SackFuellerKartoffelAdapter.Abfuellen; ->
Delphi-Quellcode:
SackFuellerAdapter.Abfuellen;
|
AW: Generics Struktur-/Typen-Problem
Mit anderen Worten: Ich suche die Delphi-Syntax, die aussagt:
Variable kann genau von Typ X oder von Typ Y sein. Diese Funktionalitaet hatte ich mir urspruenglich von meinem Split-Konzept "TBall oder TKartoffel", oder von Generics insgesamt erhofft. Ich scheitere nur gerade daran, das durchzupruegeln... es laeuft immer darauf raus, am Ende doch Typen-Weichen bauen zu muessen, oder? |
AW: Generics Struktur-/Typen-Problem
|
AW: Generics Struktur-/Typen-Problem
Irgend wo musst Du doch festlegen welchen Typ Du haben willst.
Wir haben solche Konstruktionen oft. Typischerweise wird irgendwo wird ein Aufzählungstyp ermittelt. In einer Factory wird dann anhand diesem dann die Klasse bestimmt und erzeugt. Oft gibt es auch noch eine Registry wo sich die konkreten Implementation auf den Aufzählungstyp regisitrieren. Dazwischen gibt es oft einen Klassenreferenz. In Deinem Falle wäre es:
Delphi-Quellcode:
type TRundesObjektClass class of TRundesObjekt;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz