![]() |
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 |
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. |
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. |
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);
|
AW: Verwendung einer Funktion in abgeleiteter Klasse
Zitat:
Zitat:
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; |
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? |
AW: Verwendung einer Funktion in abgeleiteter Klasse
Zitat:
OVERRIDE ist schon die richtige Lösung, um VIRTUAL oder DYNAMIC zu "überschreiben". Zitat:
Delphi-Quellcode:
, bzw, bei einer Prozedur ohne Rückgabewert
Result := inherited;
Delphi-Quellcode:
, dann werden Funktionsname und Parameter automatisch verwendet/übergeben.
inherited;
(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 04:54 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-2025 by Thomas Breitkreuz