Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verwendung einer Funktion in abgeleiteter Klasse (https://www.delphipraxis.net/207110-verwendung-einer-funktion-abgeleiteter-klasse.html)

MechMac666 25. Feb 2021 06:53

Verwendung einer Funktion in abgeleiteter Klasse
 
Hallo,
ich habe da ein Problem mit einer Funktion welche ich in einer abgeleiteten Klasse verwenden möchte.
Leider wird die abgeleitete Klasse nochmal abgeleitet.

Aber der Reihe nach:
In der "Basisklasse" gibt es eine Funktion ProcessURI.
Die war ursprünglich nur hier enthalten.
Delphi-Quellcode:
 TWebSocketProtocol = class(TSynPersistent)
  protected
  ...
  function ProcessURI(const aClientURI: RawUTF8): boolean; virtual;
  ...


In der abgeleiteten Klasse habe ich es erneut definiert.
Mit der Kennzeichnung als override wird die Funktion auch aufgerufen.
Delphi-Quellcode:
 TWebSocketProtocolChat = class(TWebSocketProtocol)
  protected
  ...
  function ProcessURI(const aClientURI: RawUTF8): boolean; override;  //virtual geht nicht, override geht
  ...


Jetzt bin ich in meiner Projekt-unit und habe die Klasse erneut abgeleitet,
aber ProcessURI wird nicht aufgerufen.
Delphi-Quellcode:
 TWebSocketProtocolEcho = class(TWebSocketProtocolChat)
 protected
  function ProcessURI(const aClientURI: RawUTF8): boolean; override;
 end;

......

 function TWebSocketProtocolEcho.ProcessURI(const aClientURI: RawUTF8): boolean;
 begin
   result:=false;  //Funktion wird nie aufgerufen
 end;

Was habe ich bei der Weitergabe falsch gemacht?

Gruß, Andreas

bcvs 25. Feb 2021 08:06

AW: Verwendung einer Funktion in abgeleiteter Klasse
 
Sieht doch soweit alles korrekt aus.

Vielleicht stimmt da beim Aufruf von TWebSocketProtocolEcho.ProcessURI etwas nicht.

Kannst da mal ein Demoprojekt machen, was das Problem reproduziert? Oft findet man gerade dabei selbst den Fehler.

MechMac666 25. Feb 2021 08:49

AW: Verwendung einer Funktion in abgeleiteter Klasse
 
Ich hatte gehofft das ich mich mit der Deklaration in der Klasse TWebSocketProtocolChat vertan hätte.
Also dort würde mir übrigens auch ein durchreichen genügen.
ICH brauche das da nicht definiert.

stahli 25. Feb 2021 08:57

AW: Verwendung einer Funktion in abgeleiteter Klasse
 
Bist Du mit Haltepunkten vertraut? Dann setze mal einen in der Methode.

Du willst letztlich die Original-Methode so überschreiben, dass sie False zurück gibt?
Dann sieht das eigentlich gut aus.

Hast Du auch Deine neue Klasse instanziiert?


Edit:
Oder, da Du von Weiterreichen schreibst...
Wenn Du die Funktion im Grund nicht verändern willst, kannst Du die vorherige Funktion aufrufen:
Delphi-Quellcode:
Result := inherited ProcessURI(aClientURI);

MechMac666 25. Feb 2021 10:30

AW: Verwendung einer Funktion in abgeleiteter Klasse
 
Zitat:

Bist Du mit Haltepunkten vertraut? Dann setze mal einen in der Methode.
Das hat nicht funktioniert, da der Prozess nicht verfügbar ist.



Zitat:

Hast Du auch Deine neue Klasse instanziiert?
Das habe ich.

Vermutlich fehlt eine Prozedur oder ein Ereignis welche(s) ProcessURI in dieser abgeleiteten Klasse aufruft.

Code:

type
  TWebSocketProtocolEcho = class(TWebSocketProtocolChat)
  protected
    function ProcessURI(const aClientURI: RawUTF8): boolean; override;
    procedure ProcessFrame(Sender: THttpServerResp; const Frame: TWebSocketFrame);
  end;

...

  protocol := TWebSocketProtocolEcho.Create('blubb','');
  protocol.OnIncomingFrame := protocol.ProcessFrame;

bcvs 25. Feb 2021 10:39

AW: Verwendung einer Funktion in abgeleiteter Klasse
 
Genau!

Gibt es irgendwo ein

Delphi-Quellcode:
protocol.ProcessURI(...);


Oder wird das in dem Create oder im ProcessFrame aufgerufen?

himitsu 25. Feb 2021 11:12

AW: Verwendung einer Funktion in abgeleiteter Klasse
 
Zitat:

virtual geht nicht, override geht
Klar geht auch "nochmal" virtual, aber dann ist das eine ganz neue Funktion, welche "nur" im Nachfahren die Funktion überdeckt, aber der Vorfahre weiß dann natürlich nichts von.

OVERRIDE ist schon die richtige Lösung, um VIRTUAL oder DYNAMIC zu "überschreiben".


Zitat:

Wenn Du die Funktion im Grund nicht verändern willst, kannst Du die vorherige Funktion aufrufen:
Delphi-Quellcode:
Result := inherited ProcessURI(aClientURI);

Es reicht sogar
Delphi-Quellcode:
Result := inherited;
, bzw, bei einer Prozedur ohne Rückgabewert
Delphi-Quellcode:
inherited;
, dann werden Funktionsname und Parameter automatisch verwendet/übergeben.
(macht Code kürzer/fehlerunanfälliger und Refactoring einfacher ... nur Strg+Linksklick auf "inherited" funktioniert leider nicht, um so zum Vorfahren zu kommen)


mögliche Ursachen:
* entweder wird deine abgeleitete Klasse garnicht verwendet
* oder die überschriebene Prozedur wird wirklich nicht aufgerufen


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