Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Property vererben (https://www.delphipraxis.net/107491-property-vererben.html)

Flips 28. Jan 2008 17:19


Property vererben
 
Hi,

hier erstmal folgender Code, der das Problem relativ einfach beschreibt:
Delphi-Quellcode:
type TRec1 = record
  dertext : string;
  procedure ShowText;
end;

type TRec2 = record
  dertext : string;
  procedure ShowText;
end;

type TKlasse = class
  private
    FText : string;
    FDaten : TRec1;
    procedure SetText(Value : string);
  public
    property Text : string read FText write SetText;
    property Daten : TRec1 read FDaten;
end;

type TSubKlasse = class (TKlasse)
  private
    FDaten : TRec2;
  public
    property Daten : TRec2 read FDaten;
end;

//...

{ TRec1 }

procedure TRec1.ShowText;
begin
Showmessage('Rec1    '+dertext);
end;

{ TRec2 }

procedure TRec2.ShowText;
begin
Showmessage('Rec2   '+dertext);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
test := TSubKlasse.Create;
test.Text := 'asdf';
test.Daten.ShowText;
test.Free;
end;

{ TKlasse }

procedure TKlasse.SetText(Value: string);
begin
FDaten.dertext := value;
FText := text;
end;
Wenn test jetzt vom Typ TKlasse ist, dann funktioniert das ganze, Ergenbis ist dann:
Rec1 asdf

Wenn test allerdings vom Typ TSubKlasse ist, dann funktioniert das ganze nicht mehr, es erscheint nur
Rec2

Klar, (F)Daten überschreibe ich, ist ja ein neuer Typ. Aber F(Text) und SetText bleibt doch im Prinzip gleich oder???

Thx,
bin mir sicher das die Antwort jedem der OOP besser beherrscht (davon gibts sicher viele^^) schnell einfällt.

Lg,
Flips

SirThornberry 28. Jan 2008 17:23

Re: Property vererben
 
ein Property kann man nicht überschreiben, es ist ja schließlich nur ein Alias auf Funktionen oder eine Variable. Wenn du auf die Variable zugreifen willst worauf das Property mit gleichem Namen der Elternklasse zeigt (also welches VERDECKT wird) dann brauchst du einfach nur auf die Elternklasse casten.

Flips 28. Jan 2008 17:31

Re: Property vererben
 
Irgendwie leuchtet es mir nicht ein^^
Mit "Elternklasse casten" meinst du doch
test := TKlasse.Create;

oder wie versteh ich das?
Dann ist ja von der Subklasse nichts mehr da.
Vielleicht sollte ich erwähnen, dass Rec1 später größtenteils andere Eigenschaften hat als Rec2.

DeddyH 28. Jan 2008 17:35

Re: Property vererben
 
Mit Elternklasse casten wird er wohl etwas wie
Delphi-Quellcode:
TElternKlasse(self).Eigenschaft
meinen.

Flips 28. Jan 2008 17:53

Re: Property vererben
 
Das einzige was ich mir vorstellen könnte wäre sowas, aber ich denke es ist falsch da es nicht geht :-)

Delphi-Quellcode:
{ TKlasse }

procedure TKlasse.SetText(Value: string);
begin
TKlasse(self).FDaten.dertext := value;
TKlasse(self).FText := text;
end;

generic 28. Jan 2008 20:58

Re: Property vererben
 
mach aus dem records klassen.
erzeuge einen vorfahren von beiden objekten.

dann kannst du das dem property zuweisen.


andere möglichkeit:
die nutzt 2 funktionen (get/set) welche überladen sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz