In Superklasse Methoden der Childklasse ausführen

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

In Superklasse Methoden der Childklasse ausführen

Beitrag von J.Renseler »

Hallo,

wie der Titel schon sagt muss ich in einer meiner Superklassen (die für die Behandlung der Keyboard Events zuständig ist) auf eine Methode zugreifen die erst in einer von ihr abgeleiteten Klasse existiert.

Wenn ich versuche in der Superklasse auf das ClassObjekt zuzugreifen über die in der "Abstract" Klasse definierte Methode :classObjekt() bekomme ich auch das Klassenobjekt meiner Subklasse zurück.
Bekomme jedoch folgende Fehlermeldung im Debugger: "Zugriff auf Instanz-Methode in Klassen-Objekt nicht erlaubt".

Gibt es eine andere Möglichkeit auf das Klassenobjekt meiner Subklasse zuzugreifen? Oder widerspricht das was ich da versuche jeglicher Klassenstruktur? :?:

Gruß,
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: In Superklasse Methoden der Childklasse ausführen

Beitrag von stevie »

J.Renseler hat geschrieben:Hallo,

wie der Titel schon sagt muss ich in einer meiner Superklassen (die für die Behandlung der Keyboard Events zuständig ist) auf eine Methode zugreifen die erst in einer von ihr abgeleiteten Klasse existiert.

Wenn ich versuche in der Superklasse auf das ClassObjekt zuzugreifen über die in der "Abstract" Klasse definierte Methode :classObjekt() bekomme ich auch das Klassenobjekt meiner Subklasse zurück.
Bekomme jedoch folgende Fehlermeldung im Debugger: "Zugriff auf Instanz-Methode in Klassen-Objekt nicht erlaubt".

Gibt es eine andere Möglichkeit auf das Klassenobjekt meiner Subklasse zuzugreifen? Oder widerspricht das was ich da versuche jeglicher Klassenstruktur? :?:

Gruß,
Jannik
Wieso benutzt du die Keyboard-Methode nicht in der Unterklasse. Ehrlich gesagt, finde ich, dass das nicht gerade der eigentlichen Klassenstruktur entspricht. Und wenn du mit deinem Keyboard ne Funktion aufrufst, die dir
die Subklasse ruft?
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Grund ist folgender ...

Alle "meine" Fensterklassen leiten sich von einer Basisklasse ab die u.a. die Behandlung der Hotkeys , die für alle Fenstertypen gleich ist, übernimmt.

In der Keyboard Methode der Superklasse findet also die Behandlung der Hotkeys statt.
Wird aber ein Hotkey nicht gefunden möchte ich das wieder die standart Keyboard Methode der Subklasse genutzt wird, bzw. je nach Dialog andere Aktionen ausgeführt werden. (Aber halt auch nur dann wenn der Taste kein Hotkey hinterlegt ist).

Deshalb muss ich halt aus der Superklasse auf die Methoden Subklasse zurückgreifen können.

Gruß,
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

eigentlich dürfte das kein Problem sein, denn zur Programmausführung bist du doch in der unteren Ebene. Angenommen deine Superklasse hat eine keyboard-Methode und deine untere Klasse auch ....

Code: Alles auswählen

Unterklasse:keyboard(...)
    local xReturn
    xReturn := ::OberKlasse:keyboard(...)  // erstmal in oberklasse abarbeiten lassen.
    ... eventuell brauchst du Flagvariablen die anzeigen ob 
    ... die Oberklasse den Event verarbeitet hat oder nicht.
    if NichtVerarbeitet
       ... mach was damit.


Die Oberklasse ruft also nicht die Unterklasse sondern die Unterklasse die Oberklasse. Von der Syntax wüßte ich jetzt auch gar nicht wie die Oberklasse in Unterklassen zugreifen sollte, denn :: startet ja mit SELF also dem Objekt der aktuellen Klasse.
Gruß
Hubert
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Hallo,

so habe ich mir bis jetzt auch beholfen ... nur ist die Sache so ... die Methoden die von der Subklasse ausgeführt werden müssen sind immer die gleichen!
Ich möchte ganz gerne Vermeiden das ich bei jedem Fenster (bzw. bei jedem von mir abgeleitete und modifizierten Xbase Part), die Methoden unnötig ableiten muss wenn das ganze ja eigentlich auch die Superklasse erledigen könnte , wenn Sie Zugriff auf die Methoden der Subklasse hätte.

Möchte halt keinen unnötigen Sourcecode haben, das gibt nur wieder Probleme beim Pflegen.

Gruß,
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

J.Renseler hat geschrieben:Grund ist folgender ...

Alle "meine" Fensterklassen leiten sich von einer Basisklasse ab die u.a. die Behandlung der Hotkeys , die für alle Fenstertypen gleich ist, übernimmt.

In der Keyboard Methode der Superklasse findet also die Behandlung der Hotkeys statt.
Wird aber ein Hotkey nicht gefunden möchte ich das wieder die standart Keyboard Methode der Subklasse genutzt wird, bzw. je nach Dialog andere Aktionen ausgeführt werden. (Aber halt auch nur dann wenn der Taste kein Hotkey hinterlegt ist).

Deshalb muss ich halt aus der Superklasse auf die Methoden Subklasse zurückgreifen können.

Gruß,
Jannik
Du kannst doch auch erst sämtliche Hotkeys in der Unterklasse abfragen und falls sie nicht vorhanden sind, auf die Oberklasse verweisen.
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

die Abfrage der Hotkeys sollte aber in der Basisklasse geschehen da sie immer identisch ist und nur für den Fall das kein Hotkey vergeben ist soll Sie den Key an den jeweiligen Keyhandler der Subklasse weitergeben und das ganze halt möglichst allgemein gültig.
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jannik,
wenn Du von einer Superklasse erbst, sind in der Subklasse alle in der Superklasse definierten Methoden bekannt und vorhanden (es gibt nur wenige Ausnahmen, die aber nur ziehen, wenn Du dies beim Definieren der Superklasse explizit angibst)!
Du brauchst also in der Subklasse nie die Methoden erneut definieren, die sind dort eh' bekannt.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Um das ganze mal etwas besser darzustellen was ich will

Code: Alles auswählen

CLASS MySuperclass 
   EXPORTED: 
                    METHOD;
                                keyboard( nKey)
ENDCLASS


METHOD MySuperclass:keyboard( nKey)
  // Hotkey behandlung
  IF Hotkey gefunden
     // Hotkey ausführen
  ELSE
     Keyhandler der jeweiligen Subklasse ausführen
  END

RETURN (SELF)


CLASS MySLE FROM MySuperclass, XbpSLE
  // Geänderte Methoden
ENDCLASS

CLASS MyComboBox FROM MySuperclass, XbpComboBox
  // Geänderte Methoden
ENDCLASS

Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jannik,

aus einer SUPER Klasse kann man keine tiefere Ebene aufrufen - zumindest soweit ich weiß.

Aber du kannst in der SUPER Klasse ein Array mit Tastencodes und aufzurufenden codeblöcken abarbeiten. Ähnlich wie bei den Menüs würdest du die Abarbeitung inder Super Klasse programieren und das Array mit den Infos über die Sondertasten der aktuellen Klasse in das Array einstellen ... somit wäre die Verarbeitung aller Events in der SUPER Klasse ohne die Notwendigkeit auf SUBCLassen zurückzugreifen.

Code: Alles auswählen

SuperKlasse:KeyBoard(...)
    ... zuerst die eigenen oder die von der Subclass prüfen ?
    if len(aShortKeys)>0
       x := ascan(...) // Ist die aktuelle Taste eine Sondertaste ? 
       if x > 0
          eval(aShortKeys[x,2])
       ...

UnterKlasse:KeyBoard(...)
    aadd(::SuperKlasse:aShortKeys, { MyKey, bMyAction } )
    ...
    ::SuperKlasse:KeyBoard(...)
Gruß
Hubert
Dirk Jucknies
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Do, 20. Dez 2007 13:29

Beitrag von Dirk Jucknies »

J.Renseler hat geschrieben:Um das ganze mal etwas besser darzustellen was ich will

Code: Alles auswählen

CLASS MySuperclass 
   EXPORTED: 
                    METHOD;
                                keyboard( nKey)
ENDCLASS


METHOD MySuperclass:keyboard( nKey)
  // Hotkey behandlung
  IF Hotkey gefunden
     // Hotkey ausführen
  ELSE
     Keyhandler der jeweiligen Subklasse ausführen
  END

RETURN (SELF)


CLASS MySLE FROM MySuperclass, XbpSLE
  // Geänderte Methoden
ENDCLASS

CLASS MyComboBox FROM MySuperclass, XbpComboBox
  // Geänderte Methoden
ENDCLASS

Hi Jannik;

ich glaube so müsste es gehen

CLASS MySuperclass
EXPORTED:
VAR self

INLINE METHOD init()
::self := ::self()
RETURN self

INLINE METHOD self()
RETURN ::&(self:className())

METHOD;
keyboard( nKey)
ENDCLASS

Wenn Du jetzt ::self:keyboard() aufrufst, hast Du die Methode aus dem obersten Kontext.

Gruß Dirk
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Hallo, :)

danke so funktioniert es.

Ich verstehe nur noch nicht so ganz warum?

Meine Idee wäre das, die Methode className() durch den Makrooperator erst zur Laufzeit ausgeführt wird, und damit eigentlich nicht mehr in der Superklasse sondern in der Instanz meiner Subklasse.

Liege ich damit richtig??

Danke an alle und Gruß,
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Dirk Jucknies
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Do, 20. Dez 2007 13:29

Beitrag von Dirk Jucknies »

Ja, du liegst richtig. Der ::classname() wird erst zur Laufzeit kompiliert.
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Danke ... hat mir gerade ein ganzes Stück weitergeholfen.

Achja und Wilkommen im Forum :)
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Dirk Jucknies
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Do, 20. Dez 2007 13:29

Beitrag von Dirk Jucknies »

Vielen Dank, hab nur den richtigen Einstieg gesucht. :roll:
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Dirk Jucknies hat geschrieben:Vielen Dank, hab nur den richtigen Einstieg gesucht. :roll:
Dafür gibt es den Vorstellungsthread http://xbaseforum.de/viewforum.php?f=9.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

er meint die Rubrik

Guten Tag, mein Name ist ... und ich bin Programmierer

in der jeder seinen Vorstellungsthread starten sollte.
Gruß
Hubert
Antworten