![]() |
(D2009) Generics mit Array als Feldvariable: Interner Fehler
Moin!
Bei der Verwendung von Generics unter Delphi 2009 bin ich kürzlich über folgende Fehlermeldung gestolpert: Zitat:
Delphi-Quellcode:
unit testGenerics;
interface uses Controls; type TMyGenericClass<T> = class private FIntegerArray: Array of Integer; // Array als Feldvariable einer generischen Klasse public constructor Create; end; implementation { TMyGenericClass<T> } constructor TMyGenericClass<T>.Create; begin // do nothing end; end.
Delphi-Quellcode:
Kann es sein dass Delphi ein Problem mit generischen Klassen hat, die Arrays als Feldvariablen haben? Wenn ich die Feldvariable entferne compiliert und läuft es fehlerfrei, ebenso wenn ich die generische Klasse zu einer nicht generischen mache. Hat jemand bereits Erfahrungen mit diesem Problem gesammelt? Compiliert das ganze unter Delphi 2010? Ein funktionierender Workaround ist folgende Variante:
unit main;
interface uses testGenerics, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TMyDummieClass = class constructor Create; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FMyGenericClass: TMyGenericClass<TMyDummieClass>; public end; var Form1: TForm1; implementation {$R *.dfm} { TMyDummieClass } constructor TMyDummieClass.Create; begin // do nothing end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin FMyGenericClass := TMyGenericClass<TMyDummieClass>.Create; // verursacht die Fehlermeldung end; end.
Delphi-Quellcode:
In besonderen Fällen kann man auch einen Wrapper um den Array basteln, andererseits wäre das ziemlich umständlich.
type
TIntegerArray = Array of Integer; TMyGenericClass<T> = class private FIntegerArray: TIntegerArray; public constructor Create; end; |
Re: (D2009) Generics mit Array als Feldvariable: Interner Fe
Ja, die erste Generation der Generics hat einige Progleme.
(wir hoffen daß Vieles in D2010 besser läuft) |
Re: (D2009) Generics mit Array als Feldvariable: Interner Fe
Zitat:
|
Re: (D2009) Generics mit Array als Feldvariable: Interner Fe
So, nach einigem experimentieren mit den Delphi2009 Generics bin ich zu folgendem Ergebnis gekommen:
1. Wenn du Arrays als Feldvariablen einer generischen Klasse verwenden möchtest, definiere sie vorher als eigenen Typen.
Delphi-Quellcode:
2. Wenn du eine generische Klasse von einer generischen Klasse verwenden möchtest, dann baue einen Wrapper um die innere generische Klasse.
type
TMyIntegerArray = Array of Integer; TMyGenericClass<T> = class(TObject) private FIntegerArray: TMyIntegerArray; public constructor Create; // etc end;
Delphi-Quellcode:
Statt
type
TMyDummieClass = class(TObject) constructor Create; // etc end; TMyGenericClass<T> = class(TOjbect) constructor Create; // etc end; // wrapper klasse für TMyGenericClass<TMyDummieClass> TMyGenericClassWrapper = class(TObject) private FMyGenericClass: TMyGenericClass<TMyDummieClass>; public constructor Create; // ruft auf FMyGenericClass := TMyGenericClass<TMyDummieClass>.Create; // etc end; TMyOtherGenericClass<T> = class(TObject) constructor Create; // etc end;
Delphi-Quellcode:
verwendet man einfach
var
LLocalVariable: TMyOtherGenericClass<TMyGenericClass<TMyDummieClass>>;
Delphi-Quellcode:
Das ist zwar wenig elegant, weil ich für jeden Typ den ich in die innere generische Klasse stecke einen neuen Wrapper schreiben muss, andererseits erhalte ich jetzt keine kryptischen Fehlermeldungen vom Compiler mehr.
var
LLocalVariable: TMyOtherGenericClass<TMyGenericClassWrapper>; |
Re: (D2009) Generics mit Array als Feldvariable: Interner Fe
Wenn du diese Typen dennoch nicht öffentlich rumliegenlassen willst:
Delphi-Quellcode:
PS: Unit Types > TIntegerDynArray
type
TMyGenericClass<T> = class(TObject) private type TMyIntegerArray = Array of Integer; private FIntegerArray: TMyIntegerArray; public constructor Create; // etc end; TMyGenericClass<T> = class(TObject) private type TMyIntegerArray = Array of Integer; var FIntegerArray: TMyIntegerArray; public constructor Create; // etc end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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