Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage beim Vererben, wenn der Datentyp sich ändert. (https://www.delphipraxis.net/133546-frage-beim-vererben-wenn-der-datentyp-sich-aendert.html)

sarte 4. Mai 2009 14:31


Frage beim Vererben, wenn der Datentyp sich ändert.
 
Hallo Leute,
ich habe ein kleines Problem beim Vererben.

Delphi-Quellcode:
type
  TKnoten = class
  protected
    left: TKnoten;
    right: TKnoten;
    Data: Integer;
  public
    [...]
    function GetLeft:TKnoten;       virtual;
    function GetRight:TKnoten; virtual;
    function GetData:Integer;  virtual;
  end;


type
  TAVLKnoten = class(TKnoten)
    protected
      balance: integer;
    public
      procedure setBalance(B: Integer); virtual;
      [...]
  end;
Wenn ich jetzt mit einer Instanz(vom Typ TAVLKnoten) eine Methode z.b. GetLeft aufrufen möchte, meckert der Compiler, da der Typ nicht von TAVLKnoten ist, sondern TKnoten. Eine Möglichkeit wäre es, gar nicht zu vererben... aber ich bin schreibfaul und möchte gern Vererben^^
Wie macht man das jetzt am Besten?
Sarte

mkinzler 4. Mai 2009 14:45

Re: Frage beim Vererben, wenn der Datentyp sich ändert.
 
Lass mal das virtual bei den Methoden, weg, welche du nicht berschreiben willst.

Medium 4. Mai 2009 14:47

Re: Frage beim Vererben, wenn der Datentyp sich ändert.
 
Das Problem wird denke ich eher sein, dass du das Ergebnis der Methode einer Variablen vom Typ TAVLKnoten zuweisen möchtest. Weil prinzipiell geht das - es wird halt nur ein TKnoten zurück gegeben.

Zwei Möglichkeiten:
1) Cast bei der Zuweisung (am besten per as-Operator)
2) Überschreiben der Methode, die die Methode der Basisklasse (TKnoten) incl. Cast ausführt (schöner - viel schöner)

Oder aber, wenn du nicht unbedingt oft Zugriff auf Felder von TAVLKnoten brauchst, eine Variable vom Typ TKnoten hernehmen. Dann kannst du später mit is/as dennoch dran kommen. Kommt halt ein wenig auf die weitere Verwendung an.

oki 4. Mai 2009 16:23

Re: Frage beim Vererben, wenn der Datentyp sich ändert.
 
Zitat:

Wenn ich jetzt mit einer Instanz(vom Typ TAVLKnoten) eine Methode z.b. GetLeft aufrufen möchte, meckert der Compiler, da der Typ nicht von TAVLKnoten ist, sondern TKnoten.
Das ist auch korrekt so. Entweder du vererbst deine Getter oder du mußt beim Aufruf casten. Hier ein Beispiel für die Vererbung:
Delphi-Quellcode:
type
  TKnoten = class
  protected
    left: TKnoten;
    right: TKnoten;
    Data: Integer;
  public
    [...]
    function GetLeft:TKnoten;      
    function GetRight:TKnoten;
    function GetData:Integer;  
  end;

type
  TAVLKnoten = class(TKnoten)
    protected
      balance: integer;
    public
      procedure setBalance(B: Integer); virtual;
      [...]
      function GetLeft:TAVLKnoten;
  end;


....
function TAVLKnoten.GetLeft : TAVLKnoten;
begin
  Result := TAVLKnoten(inherited GetLeft);
end;
Diese Variante hat den Vorteil, dass du im weiteren Verwendungscode kein Type-Casting mehr machen musst. Spart Zeit und Probleme. Ich konstruiere so übriegens alle meine speziellen Objektlisten. Hab mir dafür ein Template angelegt und braucht somit beim proggen 3 Sekunden.

Gruß oki

sarte 4. Mai 2009 21:04

Re: Frage beim Vererben, wenn der Datentyp sich ändert.
 
Vielen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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