AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generics Struktur-/Typen-Problem

Ein Thema von hzzm · begonnen am 9. Mai 2018 · letzter Beitrag vom 11. Mai 2018
Antwort Antwort
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Generics Struktur-/Typen-Problem

  Alt 9. Mai 2018, 14:05
Delphi-Version: 5
Guten Tag,

ich habe hier ein strukturelles Problem:
Delphi-Quellcode:
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;
Das Problem kriege ich aber beim Erstellen, wo ich ja die Generische Kette runter alles in Abhaengigkeit von entweder TBall oder TKartoffel generiere:
SackFuellerAdapter := TSackFuellerAdapter<TBall>.Create; -> Inkompatible Typen: SackFueller.TSackFuellerAdapter<TRundesObjekt> und SackFueller.TSackFuellAdapter<TBall>

Wenn ich mit SackFuellerAdapter := TSackFuellerAdapter<TRundesObjekt>.Create; erstelle, ist es doch gar nicht spezifiziert auf TBall oder TKartoffel?
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Generics Struktur-/Typen-Problem

  Alt 9. Mai 2018, 14:19
Delphi-Quellcode:
SackFuellerAdapter: TSackFuellerAdapter<TRundesObjekt>;
ändern zu
SackFuellerAdapter: TSackFuellerAdapter<TBall>;
ändern zu
SackFuellerBallAdapter: TSackFuellerAdapter<TBall>;
mit Sahne oben drauf:
Delphi-Quellcode:
type
  TSackFuellerBallAdapter = TSackFuellerAdapter<TBall>;

var
  SackFuellerAdapter: TSackFuellerBallAdapter;

...
begin
  SackFuellerAdapter := TSackFuellerBallAdapter.Create;
end;
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Generics Struktur-/Typen-Problem

  Alt 9. Mai 2018, 14:35
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:
if Gegebenheit1 then
  SackFuellerBallAdapter.Abfuellen
else if Gegebenheit2 then
  SackFuellerKartoffelAdapter.Abfuellen;
Das wollte ich mir eigentlich durchgaengig ersparen
-> SackFuellerAdapter.Abfuellen;

Geändert von hzzm ( 9. Mai 2018 um 14:42 Uhr) Grund: Geloescht, ich bin daemlich
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: Generics Struktur-/Typen-Problem

  Alt 9. Mai 2018, 14:49
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?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Generics Struktur-/Typen-Problem

  Alt 9. Mai 2018, 14:57
Stichwort: Varianz

https://de.wikipedia.org/wiki/Kovari..._Kontravarianz
http://delphisorcery.blogspot.de/201...-variance.html
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.442 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Generics Struktur-/Typen-Problem

  Alt 11. Mai 2018, 12:21
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:
type TRundesObjektClass class of TRundesObjekt;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz