AGB  ·  Datenschutz  ·  Impressum  







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

Generics als Parameter in Methode

Ein Thema von Martin W · begonnen am 15. Mär 2012 · letzter Beitrag vom 15. Mär 2012
Antwort Antwort
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

Generics als Parameter in Methode

  Alt 15. Mär 2012, 12:32
Delphi-Version: XE
Hallo,

folgendes Problem:

Code:
type
  TRot = class (TObject)
  end;

type
  TBlau = class (TObject)
  end;

type
  TGelb = class (TObject)
  end;

ctype
  TMain = class (Tobject)
  private
    procedure LoadObject<T: class>(aObject: T);
  end;

procedure TMain.LoadObject<T>(aObject: T);
begin
    aObject := T.Create;
end;

var
  Main: TMain;

Aufruf:

Code:
var
  Gelb: TGelb;
  Rot: TRot;
begin
  Main := TMain.Create;
  Main.LoadObject<RGelb>(Gelb);
  Main.LoadObject<TRot>(Rot)
end;
Danach sollte Gelb als TGelb initialisiert und Rot als TRot initialisiert worden sein. Funktioniert aber leider nicht... habe ich etwas grundlegendes falsch verstanden?

Martin

Geändert von Martin W (15. Mär 2012 um 13:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Generics als Parameter in Methode

  Alt 15. Mär 2012, 12:42
Mach mal nen var Parameter draus
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

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

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Generics als Parameter in Methode

  Alt 15. Mär 2012, 12:58
procedure TMain.LoadObject<T: class, constructor>(out aObject: T);
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."

Geändert von Panthrax (15. Mär 2012 um 13:52 Uhr) Grund: "constructor"-Einschränkung hinzugefügt, wie in #5 gesagt
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Generics als Parameter in Methode

  Alt 15. Mär 2012, 13:25
In beiden Fällen kommt die Meldung:

Code:
[DCC Fehler] uObjCore.pas(1685): E2568 Neue Instanz kann ohne CONSTRUCTOR-Einschränkung in der Typparameterdeklaration nicht erstellt werden
in der Zeile

Code:
aObject := T.Create;


Es scheint in die Richtung zu gehen:

http://docwiki.embarcadero.com/RADSt...n_%28Delphi%29

Geändert von Martin W (15. Mär 2012 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Generics als Parameter in Methode

  Alt 15. Mär 2012, 13:29
Die Fehlermeldung klingt doch ziemlich konkret. Definiere TMain mal als:
Code:
type
  TMain = class (Tobject)
  private
    procedure LoadObject<T: class, constructor>(aObject: T);
  end;
Mit dem zusätzlichen Constraint auf constructor sollte es gehen.

Edit: Genau diese Lösung steht doch auch in der Wiki-Page die du verlinkt hast...
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Generics als Parameter in Methode

  Alt 15. Mär 2012, 13:32
Danke, wollte ich auch gerade posten

Danke für eure Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Generics als Parameter in Methode

  Alt 15. Mär 2012, 14:18
Zitat:
Delphi-Quellcode:
procedure TMain.LoadObject<T>(aObject: T);
begin
    aObject := T.Create;
end;
Wie gesagt, ohne Var/Out-Parameter, oder als als Funktion, ist das nicht wirklich funktionsfähig.



Oder der ganz normale und überall übliche Weg, ohne Generics.
Delphi-Quellcode:
type
  TBasisClass = class of TBasis;
  TBasis = class
    constructor Create; virtual; // eventuell auch noch abstract
  end;

  TRot = class(TBasis)
  end;

function TMain.CreateObject(T: TBasisClass);
begin
  Result := T.Create;
end;

X := TMain.CreateObject(TRot);
Ich vermute auch, das es, ohne eine virtuellen Contructor, selbst bei den Generics nicht funktionieren wird.
OK, oder man sucht sich über die neu/erweiterte RTTI den entsprechenden Constructor raus und nutzt Diesen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 14:15 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