Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [OOP]: Methode (mit Parameter) überschreiben (https://www.delphipraxis.net/29433-%5Boop%5D-methode-mit-parameter-ueberschreiben.html)

mytar 9. Sep 2004 08:13


[OOP]: Methode (mit Parameter) überschreiben
 
  • Ich hab neuerdings in der VCL etwas herumgestöbert, und hab da bei allen public-Methoden kein override gesehen, obwohl die Basisklasse die selbe Methode im public-Teil hat.
    Wie soll ich das verstehen?
  • Ich hab in einer Klasse ein Methode erstellt. Ich hab diese Klasse nun beerbt und wiederum die selbe Methode verwendet nur mit anderen Parametern. Ich hab schon von reintroduce gelesen, allerdings überschreibt das die geerbte Methode ohne das ich auf diese über inherited zugreifen kann, also nicht das richtige für mich. Hier der Code:
    Delphi-Quellcode:
    TListe = class
    {...}
    public
    function Add_Knoten(Knoten: TKnoten): TKnoten;
    end;

    TNewListe = class(TListe)
    {...}
    public
    function Add_Knoten(Knoten: TNewKnoten): TNewKnoten;
    end;

    function TListe.Add_Knoten(Knoten: TKnoten): TKnoten;
    begin
    {...}
    end;

    function TNewListe.Add_Knoten(Knoten: TNewKnoten): TNewKnoten;
    begin
     Result := TNewKnoten(inherited Add_Knoten(TKnoten(Knoten))); //Löst immer einen Fehler aus
    end;
    Was mache ich falsch?

dango 9. Sep 2004 10:11

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Hallo
Zitat:

Delphi-Quellcode:
function TListe.Add_Knoten(Knoten: TKnoten): TKnoten;
begin
{...}
end;

function TNewListe.Add_Knoten(Knoten: TNewKnoten): TNewKnoten;
begin
Result := TNewKnoten(inherited Add_Knoten(TKnoten(Knoten))); //Löst immer einen Fehler aus
end;

Die Typumwandlung ist falsch ! Ein Downcast von TNewKnoten nach TKnoten ist möglich, Du versuchst hier aber einen Upcast von TKnoten nach TNewKnoten !

Gruß
Daniel

Muetze1 9. Sep 2004 10:54

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Moin!

Grundlegendes: Ich gehe davon aus, das TNewKnoten von TKnoten abgeleitet ist! - da dies vorher nicht geklärt wurde.

Wenn das der Fall ist, dann einfach so:

Code:
function TListe.Add_Knoten(Knoten: TKnoten): TKnoten;
begin
{...}
end;

function TNewListe.Add_Knoten(Knoten: TNewKnoten): TNewKnoten;
begin
Result := ( inherited Add_Knoten(Knoten) As TNewKnoten ); //Löst immer einen Fehler aus
end;
Dabei gehe ich davon aus, das Add_Knoten keine Instanz anlegt sondern eine vorhandene oder die übergebene TNewKnoten Instanz zurück gibt. Wenn es keine Instanz von TNewKnoten ist, dann schlägt die in der As Abfrage enthaltene Is Abfrage fehl und Result wird nicht gefüllt bzw. mit NIL. Daher gibt er entweder eine eindeutige TNewKnoten Instanz zurück oder Nil bzw. einen Zufallswert.

Beim Aufruf kannst du direkt die TNewKnoten Instanz angeben, weil TNewKnoten von TKnoten abgeleitet ist.

MfG
Muetze1

GuenterS 9. Sep 2004 11:16

Re: [OOP]: Methode (mit Parameter) überschreiben
 
ich denke, dass diese zwei zwar gleichnamigen Methoden wie zwei verschiedene gehandhabt werden, daher wird er auch keine inherited finden können, da sich die zwei durch die Parameter unterscheiden.

Muetze1 9. Sep 2004 15:19

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Moin!

Nein, da hat er keine Probleme, da er die andere Methode findet, weil es die Basisklasse von dem TKnoten Objekt enthält. Das übergeben Objekt hat ja schon den Typ TNewKnoten, daher hat er da kein Problem. Wenn der Parameter einen niedrigeren Typ hätte (z.B. TObject), dann würde er fehlschlagen und meckern...

MfG
Muetze1

mytar 28. Sep 2004 15:57

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Danke für die Antworten! :-D

Nochmals auf meine 1. Frage zurückzukommen:

Zitat:

Zitat von mytar
  • Ich hab neuerdings in der VCL etwas herumgestöbert, und hab da bei allen public-Methoden kein override gesehen, obwohl die Basisklasse die selbe Methode im public-Teil hat.
    Wie soll ich das verstehen?

Danke

Dax 28. Sep 2004 15:58

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Verstehe es doch so: Borland nimmt es nicht so genau..

mytar 28. Sep 2004 16:00

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Wozu gibt es dann override?
Wird dieses Überschreiben überall außer im public-Teil verwendet?
:gruebel:

mytar 2. Okt 2004 12:48

Re: [OOP]: Methode (mit Parameter) überschreiben
 
*push* :angel:

d3g 2. Okt 2004 12:53

Re: [OOP]: Methode (mit Parameter) überschreiben
 
Zitat:

Zitat von mytar
Wozu gibt es dann override?

Um zwei Prozeduren/Funktionen gleichen Namens aber mit unterschiedlichen Parametern im gleichen Gültigkeitsbereich haben zu können.

Delphi-Quellcode:
type
  TExample = class(TObject)
  public
    constructor Create();
    constructor Create(o: TObject); override;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr.
Seite 1 von 2  1 2      

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