AGB  ·  Datenschutz  ·  Impressum  







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

Generische Klassenreferenztypen

Ein Thema von Scurra · begonnen am 31. Mai 2018 · letzter Beitrag vom 31. Mai 2018
Antwort Antwort
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#1

Generische Klassenreferenztypen

  Alt 31. Mai 2018, 11:32
Delphi-Version: 10 Seattle
Hallo zusammen,

ist es möglich, generische Klassenreferenztypen zu deklarieren? Ich bräuchte so etwas, weil der Konstruktor meiner generischen Klasse ebenfalls generisch ist (siehe Beispiel unten). Da sich die Konstruktorparameter von TBaseClass und TMyObject unterscheiden, kann ich nicht die Klassenreferenz von TBaseClass verwenden.

Delphi-Quellcode:
TBaseClass = class
public
  constructor Create(AOwner: TComponent);
end;

TMyObject<I: IMyInterface> = class(TBaseClass)
public
  constructor Create(const Intf: I); reintroduce;
end;

TMyObjectClass<I> = class of TMyObject<I: IMyInterface>;

[...]

var
  myObj: TMyObject<IMySubInterface>;

...

myObj := TMyObjectClass<IMySubInterface>.Create(TMySubInterfaceImpl.Create);
Ich hoffe, dass aus dem Codeausschnitt ersichtlich wird, was ich machen möchte. Gibt es evtl. eine einfachere Möglichkeit, das umzusetzen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#2

AW: Generische Klassenreferenztypen

  Alt 31. Mai 2018, 12:01
Warum nicht so myObj := TMyObject<IMySubInterface>.Create(TMySubInterfaceImpl.Create); ?

TClass braucht man nur, wenn man "verschiedene" Klassentypen in einer Variable speichern und dann Diese später zum Erstellen/Vergleichen verwenden will.


Ich hab sowas bisher verschachtelt, also TMyObject<IIrgendwas>.TMyClass statt TMyObjectClass<IIrgendwas> , denn so gibt es die wenigsten Inkompatibilitäten und alles was zusammen gehört ist auch zusammen.
Delphi-Quellcode:
TMyObject<I: IMyInterface> = class(TBaseClass)
public type
  TMyClass = class of TMyObject<I: IMyInterface>;
public
  constructor Create(const Intf: I); reintroduce;
end;
Auch andere Typen, welche z.B. nur in dieser Klasse existieren und wo es in der Regel extern keine Variablen mit gibt, kommen auch mit da rein.
(private oder public dann halt je nach dem ob diese Typen nur in Private/Interface oder auch in Public-Deklarationen verwendet werden)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Mai 2018 um 12:07 Uhr)
  Mit Zitat antworten Zitat
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Generische Klassenreferenztypen

  Alt 31. Mai 2018, 16:18
Ich glaube, ich habe mich da irgendwo in meinem Code verlaufen. Mein ursprüngliches Ziel war es, Model, View und Presenter irgendwie zu verknüpfen. Das Problem, das ich hatte, war beim erstellen des zum View gehörigen Formular. Hier muss man nämlich die Unterscheidung treffen, ob das Formular das Hauptformular sein wird oder nicht. Falls ja, dann hätte ich mit Application.CreateForm das Formular erzeugt. Diese Methode benötigt einen Klassenreferenztyp für die Formularklasse. Das war der Grund, warum ich es mit Klassenreferenztypen versucht habe.

Ich habe jetzt das Design etwas geändert, so dass ich das Problem umgehen konnte.

Aber danke für deine Anmerkungen. Es ist auch interessant zu wissen, dass es zumindest verschachtelt funktioniert.
  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 23:48 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