![]() |
Problem Typumwandlung: Attribute der Unterklasse werden nicht übernommen
Hallo Delphi Community,
ich habe ein Problem mit der Typumwandlung eines Objekts der Oberklasse in ein Objekt der Unterklasse. Dabei werden in meinem Programm die Werte der Attribute der Unterklasse nicht übernommen, s.u. Vielen Dank für eure Tipps.
Delphi-Quellcode:
//Kernmethode, Einzelheiten s.u. function TDN.getArrTest(aiObjDN: TDN): TDoubleDynArray; lObjDN: TDN; if aiObjDN is TDNX then lObjDN := aiObjDN as TDNX; lObjDN.setBps; ShowMessage('lObjDN.getBez = ' + lObjDN.getBez); [COLOR="Red"]//klappt mit "procedure setBps; virtual; abstract;" in TDN[/COLOR] ShowMessage('lObjDN.Bez = ' + lObjDN.Bez); [COLOR="Red"]//dieses Attribut ist nicht belegt, da es von TDNX nicht übernommen wurde.[/COLOR] [COLOR="red"]//arrBps[0].Bez ist nicht verfügbar, da in TDN gilt: "arrBps: array of TDN;" und TDN kein Attribut „Bez: String“ enthält. [/COLOR] ShowMessage('lObjDN.arrBps[0].Bez = ' + lObjDN.arrBps[0].Bez; end; TDN = class(TDocClass) var Bez: String; arrBps: array of TDN; //in arrBps: Array[0..cAnzBps-1] of TDNXY; procedure setBps; virtual; abstract; function getArrTest(aiObjDN: TDN): TDoubleDynArray; end; TDNX = class(TDN) const cAnzBps = 3; var Bps1, Bps2, Bps3: TDNXY; Bez: String; arrBps: Array[0..cAnzBps-1] of TDNXY; procedure setBps; override; end; TDNXY = class(TDNX) constructor TDNX.Create; begin inherited; Bez := ‘TDNX'; end; procedure TDNX.setBps; begin Bps1 := TDNXY.Create(cRecBps1); Bps2 := TDNXY.Create(cRecBps2); Bps3 := TDNXY.Create(cRecBps3); arrBps[0] := Bps1; arrBps[1] := Bps2; arrBps[2] := Bps3; end; |
AW: Problem Typumwandlung: Attribute der Unterklasse werden nicht übernommen
Was soll denn da übernommen werden? Du hast ein Feld Bez in TDN und eins in TDNX. Da greifst du natürlich in TDNX (sprich dort deklarierten Methoden, auch einer dort überschriebenen) auf das dort deklarierte Feld zu.
Das ganze sieht ziemlich durcheinander aus. Deshalb bin ich mir nicht sicher, was du erreichen möchtest. Grundsätzlich: Ein Feld wie Bez kannst du z.B. nur in TDN unter protected schreiben und dann in TDNX einfach verwenden. Dann gibt es das nur einmal. Eine Methode kannst du überschreiben, aber die Sichtweise (welche Felder usw. habe ich) ist immer die, in der die konkrete Methode deklariert ist. Auf diese Weise kann man Methoden in der Elternklasse virtuell deklarieren, die dann erst in einer davon abgeleiteten Klasse überschrieben und mit Leben gefüllt werden. Es wäre vielleicht sinnvoll, wenn du einmal konkret beschreibst, was du eigentlich machen möchtest, nicht nur wie du es versucht hast. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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