![]() |
unbestimmter Datentyp deklarieren
Hallo, ich möchte eine Klasse deklarieren, die einen array von unbestimmten Datentypen hat. Später dann möchte ich dann z.b. Integer oder tvector zuweisen können.(Natürlich bevor dem array Werte zugewiesen wurden). Wie kann ich das machen?
Delphi-Quellcode:
so ungefähr soll das aussehen.
tbuffer = class
private items: array of tunbestimmterdatentyp; //ttrait als unbestimmter Datentyp ... public ... procedure setbestimmterdatentyp(bestimmterdatentyp: ???) |
Re: unbestimmter Datentyp deklarieren
Wenn es unbeding ein Array sein soll, dann garnicht.
Du kannst nur einen Typen nehmen, wo die beiden anderen Wunschtypen reinpassen. z.B.:
Delphi-Quellcode:
tunbestimmterdatentyp = record
case integer of 0: (i: Integer); 1: (v: tvector); end; |
Re: unbestimmter Datentyp deklarieren
Evtl. mit dem Typ Variant ?
Und in neuen Delphi-Versionen auch Generics ... |
Re: unbestimmter Datentyp deklarieren
Variant ist gut, aber ungemütlich zu handlen. Generics helfen hier gar nicht. himitsu's Lösung passt.
|
Re: unbestimmter Datentyp deklarieren
@jfheins: Generics helfen, wenn man den Typ erst zur Kompilierungszeit festlegen möchte, aber hier soll es erst zur Laufzeit passieren.
Variants und Records vertragen sich nicht sonderlich. |
Re: unbestimmter Datentyp deklarieren
Wie wärs mit nem unbestimmten Pointer?
Delphi-Quellcode:
Und Dispose nicht vergessen, sonst schaffst du 'nen Speicherleck. :angel2:
type
TAnyArray = array of Pointer; PInteger = ^Integer; PVector = ^TVector; var AnyArray: TAnyArray; ... New(PInteger(AnyArray[i])); PInteger(AnyArray[i])^ := 89; New(PVector(AnyArray[i])); PVector(AnyArray[i])^.IrgendeinFeld := 34; |
Re: unbestimmter Datentyp deklarieren
:gruebel: Und wer soll das später noch mal verstehen?
himitsu's record mit varianten sind die sauberste Lösung. :thumb: |
Re: unbestimmter Datentyp deklarieren
Natürlich könnte man auch von allen Datentypen Container-Klassen basteln, und dann einen Array of TObject draus machen... :twisted:
|
Re: unbestimmter Datentyp deklarieren
Ab Delphi 2010 könnte man es auch mit
Delphi-Quellcode:
versuchen.
array of TValue
|
Re: unbestimmter Datentyp deklarieren
hm.
hier mal der Quelltext wie es bisher aussieht, so gefällt es mir halt überhaupt nicht:
Delphi-Quellcode:
Ich denke ihr wisst am besten wir man das hier verbessern kann, wenigstens funktioniert es so, auch wenn es hässlich ist.
unit uBuffer;
interface uses uvektor; Type // Pointer auf array mit extended tarrayextended = record items:array of extended; end; parrayextended=^tarrayextended; // Pointer auf array mit tvektor3 tarraytvektor3 = record items:array of tvektor3; end; parraytvektor3=^tarraytvektor3; ... ////////// TBuffer /////////////// TBuffer = class public constructor create;virtual; destructor destroy;virtual; procedure SetSlotlength(Slotlength:integer);virtual;abstract; end; pBuffer=^TBuffer; /////////TBufferextended////////// TBufferextended = class(TBuffer) protected fparts:tarrayextended; //getter setter methoden function getparts:parrayextended; procedure setparts(nitems:parrayextended); public // create / destroy constructor create;virtual; destructor destroy;virtual; //propertys property parts:parrayextended read getparts write setparts; procedure SetSlotlength(Slotlength:integer);override; end; pBufferextended=^TBufferextended; //////////TBuffertvektor3///////// TBuffertvektor3 = class(TBuffer) protected fparts:tarraytvektor3; //getter setter methoden function getparts:parraytvektor3; procedure setparts(nitems:parraytvektor3); public // create / destroy constructor create;virtual; destructor destroy;virtual; //propertys property parts:parraytvektor3 read getparts write setparts; procedure SetSlotlength(Slotlength:integer);override; end; implementation ... end. Das Ziel hier ist, dass ich TBuffer benutzen kann, ohne gleich den Typ angeben zu müssen. Den kann ich nun später angeben. //edit: gekürzt, um Übersichtlichkeit zu schaffen |
Re: unbestimmter Datentyp deklarieren
später benutz ich das so, indem ich TBuffer deklariere und im tieferen Klassen die Variable als Tbufferextended erzeuge. Somit lege ich praktisch erst später den Typ fest und kann flexibel agieren. Das Problem ist, dass ich das bei jedem Datentyp eine neue Klasse erstellen muss, die völlig analog zu den anderen ist (siehe oben, das einzige, wo sich TbufferTvektor3 und TBufferextended unterscheiden ist die deklaration der Variable)
|
Re: unbestimmter Datentyp deklarieren
Dann könnten dir Generics doch helfen. :feuerchen:
|
Re: unbestimmter Datentyp deklarieren
hi, ich lese mich gerade ein. Du meinst generische Klassen? :bouncing4:
|
Re: unbestimmter Datentyp deklarieren
Genau.
|
Re: unbestimmter Datentyp deklarieren
hallo, wie genau definiere ich das jetzt, geht das so:
Delphi-Quellcode:
wie sage ich jetzt, dass <T> zb integer annehmen soll?
type
werte<T> = array of T; tbuffer = class private items: werte<T>; //ttrait als unbestimmter Datentyp ... public ... procedure setbestimmterdatentyp(bestimmterdatentyp: AnyType); |
Re: unbestimmter Datentyp deklarieren
Das T ist in diesem Fall der Platzhalter für den Typ in der Generic-Deklaration.
Wenn du es jetzt so schreibst,
Delphi-Quellcode:
dann heißt das, daß überall, wo im Generic "T" vorkommt, "Integer" eingesetzt werden soll;
items: werte<Integer>;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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