![]() |
Delphi-Version: 5
Frage zur Typdeklaration
In den Referenzen von emba steht etwas zu den Typdeklarationen
![]() Zitat:
Könnt Ihr mir vielleicht noch ein Beispiel geben, wann man sinnvoller Weise soetwas macht:
Delphi-Quellcode:
anstelle von dem gewohnten
type newTypeName = type KnownType
Delphi-Quellcode:
Leider verstehe Ich nicht vollständig oder nur zum Teil worum es geht.
type newTypeName = KnownType
Vielen Dank im Vorraus! :thumb: |
AW: Frage zur Typdeklaration
Delphi-Quellcode:
Dieses legt nur einen Alias an, aber der Typ selbst wird nicht verändert.
type
newTypeName = KnownType; TypeInfo(newTypeName) gibt also die Typinfo von KnownType zurück.
Delphi-Quellcode:
Das erstelle einen neuen und eigenständigen Typen an.
type
newTypeName = type KnownType; Der Compiler kann dadurch z.B. zwischen diesen Typen unterscheiden- z.B.
Delphi-Quellcode:
will unbedingt genau diesen Typen.
procadure Xyz(var i: newTypeName);
Wurde es ohne "type" deklariert, dann kann man auch KnownType übergeben, da beide "Typen" ja identisch sind. Gleiches gilt z.B. auch für überladene Methoden, wo man zwei Versionen erstellen könnte, welche jeweils einen der beiden Typen entgegennehmen ... vorausgesetzt die Typen sind unterscheidbar, also mit "type" deklariert. Gleiches gilt auch für
Delphi-Quellcode:
type
TNewClass1 = TMyClass; // Alias (alles typmäßig und inhaltlich identisch) TNewClass2 = type TMyClass; // neuer Typ, welcher aber inhaltlich identisch zu TMyClass ist TNewClass3 = class(KnownType); // abgeleitete Klasse |
AW: Frage zur Typdeklaration
Zitat:
Zitat:
|
AW: Frage zur Typdeklaration
Oder sagen wir es mal anders.
Pointertppen kann man vor der Deklaration des eigentlichen Typen deklarieren.
Delphi-Quellcode:
Ein Pointer ist immer gleich groß und der genaue Inhalt des referenzierten Types ist nicht wichtig.
type
PMyType = ^TMyType; // theoretisch würde man denken, daß TMyType noch nicht deklariert ist. ... TMyType = irgendwas; ... PMyType2 = ^TMyType; // sorum geht's natürlich auch noch Beide Typen müssen aber im selben Type-Block stehen. (das ist aber eine Einschränkung des Compilers, damit dieser sich nicht so viel merken muß und die Prüfungen, ob's den Typ wirklich gibt, sich nicht so weit ausdehnen)
Delphi-Quellcode:
Das geht also nicht.
type
PMyType = ^PMyType; ... type TMyType = irgendwas; Um einen Typen verwenden zu können, muß dessen Speichergröße aber vollkommen fest stehen. Ein Record in sich selber geht also nicht, da man sich ja noch mitten in der Typdeklaration befindet und die Größe des Records noch nicht feststeht. Außerdem würde der Record "unendlich" groß werden, wenn er direkt in sich selber deklariert würde.
Delphi-Quellcode:
Bei Objekten isses was Anderes, denn das sind ja wieder Pointer.
type
PMyRecord = ^TMyRecord; // geht ... erklärung siehe oben TMyRecord = record abc: TMyRecord; // geht nicht, da der Typ noch nicht komplett ist und außergem würde eine unendliche Rekursion entstehen def: PMyRecord; // geht ghi: ^TMyRecord; //geht, da es ein jkl: array of TMyRecord; // geht nicht, da der Typ noch nicht komplett ist (die Rekursion gibt's nicht, da ein dynamisches Array ein Pointer ist) mno: array[0..5] of TMyRecord; // geht nicht, da der Typ noch nicht komplett ist und wieder diese blöde Rekursion end; Da bei Objekte und Interfaces einem definierten Grundtypen entsprechen (TObject/IInterface) und eine definerte Größe besitzen, kann man dafür auch eine Forwarddeklaration nutzen, womit man sie nutzen kann, noch bevor sie deklariert wurden. Aber auch hier gilt natürlich, daß dieses im selben Type-Bolck stehen muß.
Delphi-Quellcode:
type
TMyObject = class; TMyObject2 = class; ... TMyObject2 = class(TIrgendwas) property A: TMyObject; property B: TMyObject2; end; ... TMyObject = class end; |
AW: Frage zur Typdeklaration
Okay, Ich könnte also auch einen Pointer-Array auf den Record in dem Record erstellen.
Dann werden Pointer verwendet und deswegen findet keine Rekursion statt, weil die Speichergröße des Records bei einem Pointer auf den Record nicht von Bedeutung ist:
Delphi-Quellcode:
Mit "Gültigkeitsbereich des Typbezeichners" ist also dessen Type-Block gemeint?
type
PMyRecord = ^TMyRecord; // geht ... erklärung siehe oben TMyRecord = record jkl: array of ^TMyRecord; // oder mno: array[0..5] of PMyRecord; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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