Seite 1 von 1

SUPER [ERLEDIGT]

Verfasst: Mo, 13. Aug 2012 18:05
von Manfred
Hm,

irgendwie habe ich das wohl in den falschen Hals bekommen. Ich war bis gerade der Meinung, dass man mit SUPER: die oberste Klasse aufrufen kann. Ich möchte gerne eine Methode überschreiben, aber zwischendurch die überschriebene Methode benutzen. Geht das unter Xbase++, oder bringe ich was durcheinander? Ich stehe derzeit wirklich auf dem Schlauch.

Re: SUPER

Verfasst: Mo, 13. Aug 2012 22:26
von UliTs
Hallo Manfred,

mit SUPER werden bei xBase 1.90355 (vorher gab es SUPER noch nicht) bei abgeleiteten Methoden die entsprechenden Methoden der Superklassen aufgerufen.
Achtung!
Bei

Code: Alles auswählen

CLASS A
...
CLASS B FROM A
...
CLASS C FROM B
ist B eine Superklasse von C, A jedoch KEINE Superklasse von C!
Also wird mit SUPER in einer abgeleiteten Methode von C auch NUR die entsprechende Methode in B (mit den gleichen Parametern) aufgerufen!

Alternativ könnte man auch selbst die Methode der Superklasse aufrufen (geht auch in xBase 1.90331):

Code: Alles auswählen

METHOD C:Linie()
LOCAL xResult
  ...
  xResult := ::B:Linie()
  ...
RETURN( xResult )
Im letzteren Fall kann man auch die Methode der Klasse A aufrufen (sicher nur sehr selten sinnvoll):

Code: Alles auswählen

METHOD C:Linie()
LOCAL xResult
  ...
  xResult := ::B:Linie()
  ::A:Linie()
  ...
RETURN( xResult )
Uli

Re: SUPER

Verfasst: Di, 14. Aug 2012 0:09
von brandelh
Manfred hat geschrieben:Ich war bis gerade der Meinung, dass man mit SUPER: die oberste Klasse aufrufen kann.
nicht die oberSTE (also Basis-Klasse) sondern nur eine Ebene also die direkte Super-Klasse.

Angenommen

XbpSle() => MySuperSle() => MyKleinSle() => MeineAktuelleKlasse()
SUPER:.... steht hier für
::MyKleinSle:....

Laut DOKU kann man auch einfach

SUPER

also ohne etwas danach schreiben, bei meinen Tests ist dann aber der Debugger um eine Zeile verrutscht.
Möglich dass dies mittlerweile korrigiert wurde :wink:

Re: SUPER

Verfasst: Di, 14. Aug 2012 7:55
von Manfred
Ja,

das denke ich doch auch so, aber irgendwas mache ich da wohl verkehrt.

Code: Alles auswählen

oDialog := haupt():new()
oDialog:machedas()
SUPER:oDialog:machedas()
SUPER wird als Fehler, bzw. undeklariert angemeckert und wenn das Programm dann an die Stelle kommt steigt es mit einer Fehlermeldung aus. Muß denn oDialog weggelassen werden? Kann ich mir nicht vorstellen, woher soll denn dann der Compiler wissen, was ich aufrufen will?

Re: SUPER

Verfasst: Di, 14. Aug 2012 8:09
von brandelh
Manfred :!:

:: / SELF und SUPER funktionieren immer nur INNERHALB der Methode ...

Normale Variablen (LOCAL, PUBLIC, PRIVATE) haben kein SUPER :D

Re: SUPER

Verfasst: Di, 14. Aug 2012 8:11
von Manfred
Hm,

dachte ich mir. Aber wie komme ich an die überschriebene Methode dran?

Re: SUPER

Verfasst: Di, 14. Aug 2012 8:16
von brandelh
Nachdem du das so fragst, bin ich mir fast ein bischen unsicher ... vorausgesetzt, die Methoden sind exported (sonst geht gar nix von außen):

oDlg:IrgendEineMethode() ...
oDlg:SUPER:IrgendEineMethode() ... das sollte gehen, habe es aber nicht probiert
oDlg:XbpDialog:IrgendEineMethode() ... sowas geht, z.B. bei combobox braucht man das um zum SLE zu kommen ...

Re: SUPER

Verfasst: Di, 14. Aug 2012 8:19
von Manfred
Nö,

wird auch angemeckert als unbekannte Variable.

also oDialog:super:machwas()

Re: SUPER

Verfasst: Di, 14. Aug 2012 8:21
von brandelh
Dann musst du halt tatsächlich die SUPER Klasse beim Namen nennen ;-)

Re: SUPER

Verfasst: Di, 14. Aug 2012 8:22
von Manfred
Aaaber,

wenn man

Code: Alles auswählen

oDialog:namedereigenensuperklasse:machewas() 
aufruft, dann geht es.

Hubert war schneller.

Wäre mit Super aber einfacher, denn evtl. weiß man ja nicht immer, wie die Superklasse heißen könnte, wenn es was Fremdes ist.

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 10:50
von UliTs
Diese Vorgehensweise widerspricht der Kapselung von Klassen!
Es wundert mich, das xBase++ so etwas erlaubt. Meines Erachtens handelt es sich um einen Compilerfehler :) .

Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 11:30
von brandelh
Exportierte Methoden wurden ja genau deswegen exportiert, weil der Endanwender etwas mit denen machen will ;-)
Ansonsten hätte der Ersteller protected oder gar hidden gewählt 8)

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 11:58
von UliTs
brandelh hat geschrieben:Exportierte Methoden wurden ja genau deswegen exportiert, weil der Endanwender etwas mit denen machen will ;-)
Ansonsten hätte der Ersteller protected oder gar hidden gewählt 8)
Hallo Hubert,
das verstehst Du falsch!
Wenn Du eine Klasse ableitest und eine bereits bestehende Methode neu schreibst, wird die bisherige Methode dadurch gekapselt!
Wenn Du "protected" oder "hidden" wählst, kann außerhalb der Klasse nicht mehr auf die Methode zugegriffen werden. Und das will der Ersteller in diesem Fall ja NICHT.
ABER der Ersteller MUSS eine Möglichkeit haben, in einer abgeleiteten Klasse den Zugriff auf die Methode der SUPER-Klasse zu verhindern! Und das ist sonst nicht möglich!

Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 12:04
von Tom
Kleiner Tipp: Einfach mal "Das Konzept von SUPER" in der Doku lesen! :wink:

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 12:15
von UliTs
Tom hat geschrieben:Kleiner Tipp: Einfach mal "Das Konzept von SUPER" in der Doku lesen! :wink:
Hallo Tom,
irgendwie bin ich zu blöd, in der Dokumentation etwas über "SUPER" zu finden.
Wie heißt die Hilfe-Datei, die Du benutzt und welches Datum hat sie?

Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 12:18
von Manfred
Uli,

ich kam auch erst darauf, als ich unter SUCHEn ging und da SUPER eintippte

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 12:19
von Tom
Hallo, Uli.

Ich benutze die Referenzdoku zu 1.9 SL1 (10.4.2009). Tatsächlich gibt es im Index keine Treffer zu "SUPER", aber die Suchanfrage "Das Konzept von SUPER" sollte Dich zum entsprechenden Thema führen.

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 12:29
von UliTs
Hallo Tom,

die meisten Dateien haben bei mir auch das Datum 10.04.2009.
Aber die Hilfedatei xpplang20.chm im Verzeichnis Alaska/xppw32/help hat das Datum 03.05.2006. Ich finde auch nichts anderes :-(
Heißt die Hilfedatei bei Euch auch so?

Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 12:32
von Manfred
Uli,

im verzeichnis Book und dann xppref.hlp

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 13:00
von UliTs
Danke!
Nichts desto trotz ist die Datei bei mir leider von 2006 :-( .
Ich mach mich mal auf die Suche ...

Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 13:09
von Tom
Hassu 1.9 ohne Ess-Ell-Eins, Uli? :wink:

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 13:23
von brandelh
UliTs hat geschrieben:das verstehst Du falsch!
immer wieder erfrischend solche Kommentare zu lesen :D

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 13:47
von UliTs
Tom hat geschrieben:Hassu 1.9 ohne Ess-Ell-Eins, Uli? :wink:
Ich arbeite damit bisher zwangsweise nur selten sondern mit der 1.90.311.
Die 1.90.355 ist doch SL1 oder meinst Du noch etwas anderes?

Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 13:48
von UliTs
brandelh hat geschrieben:immer wieder erfrischend solche Kommentare zu lesen :D
Oh Sorry...
Ich wollte Dir nicht auf die Füße treten :shock: . Hätte wohl besser "Ich bin anderer Meinung" schreiben sollen :) .
Uli

Re: SUPER [ERLEDIGT]

Verfasst: Di, 14. Aug 2012 14:59
von Tom
Hallo, Uli.

Ob das SUPER-Konzept erst mit SL1 (355) eingeführt wurde oder schon vorher, kann ich Dir nicht sagen (die Doku tut's nämlich auch nicht), aber ich finde in der Hilfe der 331 den entsprechenden Hilfetext auch nicht.