![]() |
Delphi-Version: 2010
Ableiten von Records
Ist es inzwischen möglich von Records abzuleiten und wenn ja - wie?
Es geht um folgendes. Ich habe einen Record (TRecordBase) mit verschiedenen Funktionen etc. Jetzt benötige ich an bestimmten Stellen noch weitere Informationen die nicht im Record enthalten sind. Normalerweise würde ich den bisherigen Record einfach erweitern. Das geht jedoch nicht da der Record an bestimmten Stellen auch in eine Datei geschrieben wird bzw. daraus gelesen wird. Um nicht überall den Quelltext ändern zu müssen und die bisherigen Recordfunktionen kopieren zu müssen etc. würde ich somit gern vom bisherigen Record ableiten. Bisher habe ich das so gelöst:
Delphi-Quellcode:
Das hat jedoch den Nachteil das man die Stellen wo bisher "baseRecord.ValueXY := ..." verwendet wurde, ändern muss zu "baseRecord.Base.ValueXY := ..."
TMyNewRecord = record
Base: TRecordBase; extraData: Byte; end; Das ganze auf Objekte umzustellen ist in dem Fall keine Lösung (also bitte diesen Lösungsvorschlag vergessen). |
AW: Ableiten von Records
Afaik gibt es keinen sauberen Weg.
Entweder man macht es so wie du (immer weiter das abzuleitende Record als seperate Eigenschaft kapseln) oder man macht eine Klasse draus. |
AW: Ableiten von Records
Records bieten keine Vererbung, wengleich sowas bestimmt cool gewesen wäre.
(also eingebettete Records zumindestens) also dein bisheriger Weg wäre so das allgemein anerkannte Vorgehen. |
AW: Ableiten von Records
Zitat:
Seit 2006 könnte man aber auch noch sowas machen:
Delphi-Quellcode:
TRecordBase = record
Feld1: Integer; Feld2: String; end; TMyNewRecord = record private function GetFeld1: Integer; inline; ... public Base: TRecordBase; extraData: Byte; property Feld1: Integer read GetFeld1 write SetFeld1; end; function TMyNewRecord.GetFeld1: Integer; begin Result := Base.Feld1; end; |
AW: Ableiten von Records
Es muss auch nicht unbedingt Vererbung im eigentlichen Sinne sein.
Mir wäre auch so etwas ganz recht:
Delphi-Quellcode:
Das dies geht wenn man den Record-Inhalt in externe Dateien auslagert ist mir klar aber geht das auch in einer Datei das man einen Quellcodeabschnitt später wieder verwenden kann?
TBaseRecord = record
{$CONTENT01} Value: Byte; {$ENDCONTENT} end; TNewRecord = record {$I $CONTENT01} end; Mir geht es hauptsächlich darum nicht an Zig stellen alles ändern zu müssen sondern mir wäre es ganz recht wenn ich nur die Declaration ändern muss. |
AW: Ableiten von Records
Delphi-Quellcode:
oder vielleicht in etwa sowas, wo man dann namenlos einen Record irgendwo einfügen kann.
TBaseRecord = record
Value: Byte; end; TNewRecord = record(TBaseRecord) Value2: Integer; end; // welches dann dieses gergibt (neue Werte hinten angehängt) TNewRecord = record(TBaseRecord) Value: Byte; Value2: Integer; end;
Delphi-Quellcode:
Von der Syntax her wäre Beides kein Problem und bestimmt nichmal all zu schwer implementierbar.
TBaseRecord = record
Value: Byte; end; TNewRecord = record(TBaseRecord) Value2: Integer; *: TBaseRecord; Value3: Integer; end; |
AW: Ableiten von Records
Zitat:
Somit entfällt das ".Base." - aber du verlierst auch den Zugriff auf die neuen Felder. |
AW: Ableiten von Records
Genau, so ähnlich mache ich es jetzt auch (bis es eine bessere Lösung gibt). Aber mir wäre es lieber mit weniger Quelltextänderungen das ganze hin zu bekommen.
|
AW: Ableiten von Records
Zitat:
Delphi-Quellcode:
type
TRecordBase = record Feld1: Integer; Feld2: string; end; TMyNewRecord = record public Base: TRecordBase; extraData: Byte; property Feld1: Integer read Base.Feld1 write Base.Feld1; end; |
AW: Ableiten von Records
Das bringt mich nur kein Stückchen Weiter.
Dann müsste ich ja für jedes Feld in meinem Record (sind etwa 30 Stück) ein Property definieren. Und wenn ich irgendwann von TMyNewRecord auf diese Art "ableite" bezweifle ich das er dann auf eben die gleiche Weise auf Feld1 von Base zugreifen würde:
Delphi-Quellcode:
TRecordBase = record
Feld1: Integer; Feld2: string; end; TMyNewRecord = record public Base: TRecordBase; extraData: Byte; property Feld1: Integer read Base.Feld1 write Base.Feld1; end; TMyNewRecordV2 = record public Base: TMyNewRecord; extraData2: Byte; property Feld1: Integer read Base.Feld1 write Base.Feld1; // <== funktioniert nicht da bei read und write Felder erwartet werden end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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