Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Problem Typumwandlung: Attribute der Unterklasse werden nicht übernommen (https://www.delphipraxis.net/215470-problem-typumwandlung-attribute-der-unterklasse-werden-nicht-uebernommen.html)

enigma 9. Jul 2024 17:23

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;

jaenicke 9. Jul 2024 18:04

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