![]() |
[OOP]: sinnvolle Vererbung
Schon seit längerer Zeit versuche ich mich in die OOP einzuarbeiten.
Nun hab ich aber oft Probleme mit der Vererbung. Ich kenne die meisten Compilerdirektiven (virtual, override usw.), hab aber trotzdem Probleme. Neuerdings hab ich mir eine Liste zusammengeproggt, und das meiner Klasse TMyList implementiert. Dort brauche ich natürtlich auch eine Wurzel:
Delphi-Quellcode:
Nun hab ich aber eine Weiterentwicklung von TKnoten gemacht, natürlich durch Vererbung.
TMyList = class
private Wurzel: TKnoten; public procedure Hinzufuegen; {...} end; Diese Weiterentwicklung von TKnoten möchte ich nun in eine weitere Listenklasse implementieren.
Delphi-Quellcode:
Ihr sehr jetzt mein Problem mit der Wurzel, und ich habe ja auch Hinzufuegen von TMyList geerbt.
TMyNewList = class(TMyList)
private Wurzel: TNewKnoten; public {...} end; Leider arbeitet die Prozedur Hinzufügen mit TKnoten. Muss ich jetzt die Methode Hinzufügen in TMyNewList neu implentieren, oder kann ich mit inherited auf Hinzufügen zugreifen, allerdings mit Instanzen von TNewKnoten? |
Re: [OOP]: sinnvolle Vererbung
Da TMyList nur TKnoten kennt, musst du der Prozedur eine "runtergecastete" Instanz von TMyKnoten übergeben -->
Delphi-Quellcode:
Wenn du auf irgendwas zugreifen musst, was in TNewKnoten enthalten ist, dann musst du die Proezdur neu implementieren, vielleicht geht es sogar so:
TMyList = class
private Wurzel: TKnoten; public procedure Hinzufuegen(var Neu: TKnoten); {...} end; TMyNewList = class(TMyList) private Wurzel: TNewKnoten; public {...} end; ... //Aufruf var Liste: TMyNewList; NeuerKnoten: TNewKnoten; begin ... NeuerKnoten := TNewKnoten.Create; Liste.Hinzufügen(NeuerKnoten); //von Typ TNewKnoten, der von TKnoten abstammt ...
Delphi-Quellcode:
procedure TMyNewList.Hinzufuegen((var Neu: TNewKnoten);
begin inherited Hinzufuegen; // weiß nicht genau, vielleicht auch so: inherited Hinzufuegen(Neu); //Mach irgendwas mit Neu als TNewKnoten end; |
Re: [OOP]: sinnvolle Vererbung
Muss ich Wurzel: TNewKnoten üverhaupt in TMyNewList neu implementieren, oder kann ich Wurzel von TMyList irgendwie manipulieren?
|
Re: [OOP]: sinnvolle Vererbung
Müsstest Du können. Allerdings hast du Wurzel:TKnoten als private deklariert, deswegen ist das nur in dieser Klasse sichtbar. Damit die Ableitungen (TMyNewList) auf das Wurzel-Attribut aus der Mutterklasse zugreifen kann, musst du es als protected oder public deklarieren:
Delphi-Quellcode:
nun ist Wurzel vom Typ TKnoten auch in den abgeleiteten Klassen sichtbar.
TMyList = class
protected Wurzel: TKnoten; public procedure Hinzufuegen(var Neu: TKnoten); {...} end; |
Re: [OOP]: sinnvolle Vererbung
Zitat:
Zitat:
Delphi-Quellcode:
function TMyNewList.GetWurzel: TNewKnoten;
begin Result := Wurzel; // Eigenschaften kopieren... Result.Irgendwas := TMyList(Self).Wurzel.Irgendwas; // vielleicht geht sogar Result.Irgendwas := inherited Wurzel.Irgendwas oder so ähnlich??? end; |
Re: [OOP]: sinnvolle Vererbung
Zitat:
Was ist der Unterschied zwischen
Delphi-Quellcode:
und
TMyNewList(MyList)
Delphi-Quellcode:
?
MyList as TMyNewList
|
Re: [OOP]: sinnvolle Vererbung
Zitat:
Zitat:
|
Re: [OOP]: sinnvolle Vererbung
Schau Dir dazu doch auch mal in der Unit Classes.pas der VCL (source liegt Deiner Enterprise ja bei) die beiden Klassen TCollection und TCollectionItem an.
Dort ist das so implemetiert, das Du beim erzeugen der (abgeleiteten) Collection/Liste den Typ (also die Klasse) der Items mitgibst. Diese werden dann durch eine Classfactory als entsprechende Objekte hinzugefügrt / created. |
Re: [OOP]: sinnvolle Vererbung
Zitat:
Wobei es mittels Polymorphie auch funktionieren müsste, wenn TNewKnoten von TKnoten abgeleitet wird. Dann müsste er in der TMyNewList ein Objekt von TNewKnoten in dem Wurzel-Attribut von TKnoten instanzieren können. |
Re: [OOP]: sinnvolle Vererbung
@Bowler: Wie bitte? Könntest du das etwas einfacher erklären?
Danke! P.S.: Bitte nicht im Konjunktiv schreiben! :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz