AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Verwendung einer Funktion in abgeleiteter Klasse

Verwendung einer Funktion in abgeleiteter Klasse

Ein Thema von MechMac666 · begonnen am 25. Feb 2021 · letzter Beitrag vom 25. Feb 2021
Antwort Antwort
MechMac666

Registriert seit: 9. Nov 2008
89 Beiträge
 
#1

Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 07:53
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

Geändert von MechMac666 (25. Feb 2021 um 09:49 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
563 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 09:06
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.
  Mit Zitat antworten Zitat
MechMac666

Registriert seit: 9. Nov 2008
89 Beiträge
 
#3

AW: Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 09:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 09:57
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:
Result := inherited ProcessURI(aClientURI);
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (25. Feb 2021 um 09:59 Uhr)
  Mit Zitat antworten Zitat
MechMac666

Registriert seit: 9. Nov 2008
89 Beiträge
 
#5

AW: Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 11:30
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;

Geändert von MechMac666 (25. Feb 2021 um 11:33 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
563 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 11:39
Genau!

Gibt es irgendwo ein

protocol.ProcessURI(...);

Oder wird das in dem Create oder im ProcessFrame aufgerufen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.377 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Verwendung einer Funktion in abgeleiteter Klasse

  Alt 25. Feb 2021, 12:12
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:
Result := inherited ProcessURI(aClientURI);
Es reicht sogar Result := inherited; , bzw, bei einer Prozedur ohne Rückgabewert 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (25. Feb 2021 um 12:15 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf