![]() |
Create wird nicht aufgerufen bei Klassen-Chaos
Hi
ich schreibe grade an einer Importer-Klasse... Diese soll möglichst einfach erweiterbar sein, daher habe ich mir folgendes Konzept ausgedacht: Eine virtuelle Basisklasse, und mehrere Klassen, die diese Implementieren, für jeden Datentyp einen. Code:
Delphi-Quellcode:
Als erstes die Basisklasse, dann eine Implementation für ein DBF-File.
type
TImport_Virtual = class(TObject) private //Basisklasse für ImportTyp FFileName: String; FFileExt: String; public FData: TDataArray; function OpenFile(var Err: String):Boolean; virtual; abstract; function CloseFile(var Err: String):Boolean; virtual; abstract; function Analyse(var Err: String):Boolean; virtual; abstract; function GetData(var Dat: TDataArray):Boolean; property FileName: String read FFileName write FFileName; end; TImportClassType = class of TImport_Virtual; TDBFImport = class(TImport_Virtual) private //Import aus DBF-Datei FDBF: TDBFFile; public constructor Create; destructor Destroy; function OpenFile(var Err: String):Boolean; override; function CloseFile(var Err: String):Boolean; override; function Analyse(var Err: String):Boolean; override; end; type TImport = TImport_Virtual; So rufe ich das ganze auf:
Delphi-Quellcode:
GetImportType gibt den zu der Endung passenden Importer zurück...das klapp auch. in Classname steht auch TDBFImport drin!
Typ:=GetImportType(Edt_FileName_Man.FileName);
if Typ=nil then begin Log('Importer laden',True,cEFileExt); Exit; end else Log('Importer laden',False,''); Import:=Typ.Create;
Delphi-Quellcode:
Nun setze ich im OnCreate der Implementation FFileExt auf die jeweilige Endung (hier '.dbf')
TImportType = record //Import-Typ
Import: TImportClassType; FileExt: String; Description: String; end; TImportArray = array[0..0] of TImportType; const //Import-Typen cImports: TImportArray = ( (Import: TDBFImport; FileExt: '.dbf'; Description: 'DBF-Datei') ); function GetImportType(FileName: String): TImportClassType; var Ext: String; i, ID:Integer; begin Ext:=LowerCase(ExtractFileExt(FileName)); ID:=-1; for i:=0 to Length(cImports)-1 do if LowerCase(cImports[i].FileExt)=Ext then ID:=i; if ID=-1 then Result:=nil else Result:=cImports[ID].Import; end; Allerdings wird dieses Create nie aufgerufen! hat irgendeiner eine Idee warum das so ist? |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Ich habe keine Ahnung was du da machst, aber wäre ein override beim Konstruktor vielleicht hilfreich?
Edit: Oh, beim Destruktor auf jeden Fall! MfG Thorsten |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Genau. Aus diesem Grund ist auch der Konstruktor von TComponent virtuell.
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Geht nicht.
[Fehler] UImport.pas(36): E2170 Eine nichtvirtuelle Methode kann nicht überschrieben werden und wenn ich in der Basisklasse auch ein virtual; abstract; Create einfüge, so kommt ein Abstrakter Fehler... |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Ganz sicher, dass in der Variable eine Klasse ungleich der Basisklasse ist und deren Konstruktor mit override markiert ist?
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Ja.
Typ.ClassName ist eindeutig TDBFImport. Import.ClassName übrigens auch :) |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Du hast mich so verunsichert, dass ich es selbst ausprobiert habe ^^ .
Delphi-Quellcode:
Funktioniert wie erwartet :P .
type
TBase = class public constructor Create; virtual; abstract; end; TDescendant = class(TBase) public constructor Create; override; end; TBaseClass = class of TBase; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var c: TBaseClass; begin c := TDescendant; c.Create; end; |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Oh, habe mich oben verschrieben. (ist jetzt korrigiert)
Ich meinte natürlich beim EDIT den Destruktor! MfG Thorsten |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Es muss vor allem nur ein virtueller Constructor Create definiert werden in der TImport_Virtual - kein abstrakter!
Die Ableitungen müssen ihn überschreiben und dann wird dieser auch aufgerufen... |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
Zitat:
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
Grundlegend ist es unlogisch und eigentlich sollte Delphi auch einen Fehler bringen bei dem gleichen Weg mit einer Methode anstatt eines Constructors. Aber durch die besondere Stellung des Konstruktors wird er es wohl akzeptieren, aber ich wage zu bezweifeln, dass er es mit einer Methode so mit sich machen lässt (Behauptung/Vermutung meinerseits ohne es jetzt nachzuprüfen). Zitat:
Delphi-Quellcode:
Wird in deinem Falle immer TImport_Virtual.Create aufgerufen, aber nie der Konstruktor der Ableitung, da dieser nur durch ein überschreiben (sprich dynamischer/virtueller Konstruktor) aufgerufen wird. Durch das überschreiben wird die Methode der am höchsten entwickelten Klasse (von dem Basistyp TImport_Virtual ausgehend spezialisiserter) aufgerufen, da die Konstruktoren durch das überschreiben die alten in der VMT ersetzen. Beim verdecken bzw. definieren eines Constructors ohne irgendwas wird keine Ersetzung durchgeführt.
TImportClassType = class of TImport_Virtual;
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
Zitat:
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Jetzt funktioniert es so:
Delphi-Quellcode:
aber man darf dann im Create nicht inherited Create; aufrufen ;)
type
TImport_Virtual = class(TObject) private //Basisklasse für ImportTyp FFileName: String; FFileExt: String; public FData: TDataArray; constructor Create; virtual; abstract; destructor Destroy; virtual; abstract; function OpenFile(var Err: String):Boolean; virtual; abstract; function CloseFile(var Err: String):Boolean; virtual; abstract; function Analyse(var Err: String):Boolean; virtual; abstract; function GetData(var Dat: TDataArray):Boolean; property FileName: String read FFileName write FFileName; end; TImportClassType = class of TImport_Virtual; TDBFImport = class(TImport_Virtual) private //Import aus DBF-Datei FDBF: TDBFFile; public constructor Create; override; destructor Destroy; override; function OpenFile(var Err: String):Boolean; override; function CloseFile(var Err: String):Boolean; override; function Analyse(var Err: String):Boolean; override; end; |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Cool,
äh was hatte ich noch in meinem ersten Post geschrieben? MfG Thorsten |
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
Zitat:
|
Re: Create wird nicht aufgerufen bei Klassen-Chaos
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 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