![]() |
Klasse als Parameter einer Funktion
Hi,
wie soll ich's erklären? Ich möchte eine Funktion deklarieren, in der eine Klasse übergeben wird und je nach Situation die übergebene Klasse instanziert wird und als Ergebnis die Instanz zurückgeliefert wird. Beispiel: Ich Übergebe der Funktion die Klasse TMeinObject (abgeleitet von TObject). Je nach Bedingung erhalte ich als Ergebnis eine Instanz von der übergebenen Klasse oder NIL. Aufrufen möchte ich die Funktion folgendermassen:
Delphi-Quellcode:
var
EineVariable:TObject; begin EineVariable:=ErzeugeMeinObjekt(TMeinObject); end; Der gleichen Funktion möchte ich aber auch eine andere von TObject abgeleitete Klasse übergeben.
Delphi-Quellcode:
var
EineVariable:TObject; begin EineVariable:=ErzeugeMeinObjekt(TMeinAnderesObject); end; Wie soll nun die Funktion aussehen? So geht's leider nicht. Der Compiler lässt sich einfach nicht überzeugen.
Delphi-Quellcode:
function ErzeugeMeinObjekt(IrgendeineKlasse):Tobject;
begin if bedingung then result:=IrgendeineKlasse.create else result:=nil; end; Gerd |
Re: Klasse als Parameter einer Funktion
du musst mit "Class of" einen neuen Typen declarieren.
Zum Beispiel so:
Delphi-Quellcode:
anschließend kannst du diesen Typ übergeben
type
TObjectClass = class of TObject;
Delphi-Quellcode:
function MeineFunktion(ATyp: TObjectClass): TObject;
begin result := TObjectClass.Create; end; |
Re: Klasse als Parameter einer Funktion
Hallo,
das Beispiel von Jens wird nicht in allen Fällen funktionieren - und das liegt nicht nur daran, daß er den Übergabeparameter nicht benutzt. Wenn die abgeleiteten Klassen den (statischen) Konstruktor von TObject überschreiben, wird der neue Konstruktor nicht aufgerufen. Um dies zu beheben, muß die Deklaration wie folgt abgeändert werden:
Delphi-Quellcode:
Gruß Hawkeye
type
// TMeinObjectClass = class of TObject; // kein Aufruf des Konstruktors TMeinObjectClass = class of TMeinObject; // Konstruktor wird aufgerufen TMeinObject = class (TObject) public constructor Create; end; TMeinAnderesObject = class (TMeinObject) public constructor Create; end; constructor TMeinObject.Create; begin inherited; ShowMessage (ClassName + '.Create'); end; constructor TMeinAnderesObject.Create; begin inherited; ShowMessage (ClassName + '.Create'); end; function ErzeugeMeinObjekt (aClass: TMeinObjectClass): TObject; begin Result := aClass.Create; end; |
Re: Klasse als Parameter einer Funktion
Genau das war's was ich gesucht hatte.
Danke Gerd |
Re: Klasse als Parameter einer Funktion
Ups, da hab ich beim Tippen nen Fehler gemacht. Sollte natürlich
Delphi-Quellcode:
heißen. Aber es ist natürlich richtig das dies Praktisch keinen Sinn macht weil ein neu definierter Constructor so nicht aufgerufen wird.
function MeineFunktion(ATyp: TObjectClass): TObject;
begin result := ATyp.Create; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 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 by Thomas Breitkreuz