protected

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

protected

Beitrag von Manfred »

Mal wieder eine dolle Frage,

Wenn Methoden, oder Variabeln in einer CLASS PROTECTED gemacht werden, dann sollten sie doch innerhalb der eigenen Methoden aufrufbar sein, oder habe ich da etwas falsch gelesen?

Bsp:

Code: Alles auswählen

CLASS test
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENCLASS
****************
METHOD test:tuwas()
             ::suchen()
RETRUN self
****************
METHOD test:suchen()
             @ 5,1 SAY "Hallo"
RETURN self
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
das hast Du im Prinzip richtig verstanden.

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.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Na gut,

warum klappt es dann nicht? Es kommt die Meldung, das der Zugriff nicht erlaubt ist.

Hm, was mag das nur wieder für ein Mist sein?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hm, oder ist das hier falsch?

Code: Alles auswählen

CLASS test
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENCLASS
****************
METHOD test:tuwas()
             @ 5, 2 GET wusel;
             VALID ::suchen()
RETRUN self
****************
METHOD test:suchen()
             @ 5,1 SAY "Hallo"
RETURN self

Ich schätze mal, das wird es sein, weil das READ in einem anderen Quelltext steht.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

nö, das war es nicht.

Das Read habe ich jetzt direkt darunter geschrieben, aber es kommt die gleiche Meldung.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
olaf870
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 128
Registriert: Mi, 26. Okt 2005 18:41
Wohnort: Berlin
Kontaktdaten:

Beitrag von olaf870 »

Hallo Manfred,

Ich meine, wenn jemand schon Fragen zu komplexeren Codefragmenten beantwortet haben möchte, er sich dann doch wenigstens die Mühe machen sollte, etwas compilierfähiges zusammenzustellen. Doch leider hast Du - genau wie es wie viele andere zu tun pflegen - deinen Code nur unvollständig zugeschickt, so daß Du es niemand leicht machst, Dir zu helfen. Dein Code kann aber wohl gleich aus mehreren Gründen nicht funktionieren.

Eine INIT-Methode fehlt. Deswegen kannst Du auch keine solche aufrufen.

Die Anweisung RETRUN wird wahrscheinlich auch bei Dir nicht compiliert.

Die VALID-CLause einer Get Anweisung verlangt einen logischen RETURN-Wert.

Und: Der Aufruf von Methoden, die in einer einer übergeordneten DLL oder EXE definiert sind, ginge sowieso nicht.

Gruß
Olaf870
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hallo Olaf,

mh, Du hast bedingt Recht. Es sind wirklich nur Codefragmente, die sollten aber für das Beispiel reichen. Es ging hier nur um das Prinizp, wie die Methode aufgerufen wird. Mehr nicht. Natürlich ist der Rest, den Du erwähnst vorhanden. Die Klasse klappt auch, es hapert halt nur an der Verweigerung der Methode, sich aufrufen zu lassen.

Ich verstehe es selbst nicht, weil ich es bei anderen Methoden auch schon so gemacht habe und da klappt es.

Ich habe sie jetzt einfach wieder Exported gemacht und werde mich irgendwann einmal später darum kümmern.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

nach Beseitigung der Tippfehler und hinzufügen einer MAIN Procedure lässt sich dein Beispiel hier einwandfrei mit 1.82 compilieren und ausführen.
Ein READ spielt bei einem SAY sowieso keine Rolle.

Code: Alles auswählen

proc main
   local oTest
   cls
   oTest := test():new()
   oTest:tuwas()
   wait
return

CLASS test
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENDCLASS
****************
METHOD test:tuwas()
             ::suchen()
RETURN self
****************
METHOD test:suchen()
             @ 5,1 SAY "Hallo"
RETURN self
Zu beachten ist auf jeden Fall diese Zeile

Code: Alles auswählen

   oTest := test():new()
Du hast zwar keine INIT() Methode definiert, aber du must diese dennoch aufrufen ! Dann wird wohl eine sehr grundlegende aufgerufen.
Create() braucht man nur dann wenn Systemresourcen belegt werden, also kann man sich hier sparen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Olaf,
olaf870 hat geschrieben:Eine INIT-Methode fehlt. Deswegen kannst Du auch keine solche aufrufen.
wie du aus meinem - funktionierenden - Beispiel ersehen kannst, ist es nicht nötig eine INIT() bzw. CREATE() Methode zu erstellen.
Nur :NEW() muss man dennoch aufrufen !
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:Es sind wirklich nur Codefragmente, die sollten aber für das Beispiel reichen.
Die Main-Prozedur braucht man immer und die sollte das erzeugen einer Instanz und den Aufruf der Methoden zeigen, welche zu dem Fehler führen.
Dabei wären auch schnell die Tippfehler aufgefallen.

Wichtig ist dann auch die XPPERROR.LOG mitzuliefern.

Es hätte auch sein können, dass das Programm im reinen GUI Modus gelinkt wurde und @ say nicht zur Verfügung stehen würde. Dann hätte die Fehlermeldung nur angezeigt, dass die Zeile mit @ say den Fehler verursacht hätte, was leicht bei der verkürzten Darstellung unter den Tisch fällt.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

du hast ja noch ein READ Beispiel, hier wird deutlich, wo das Problem liegt:

Code: Alles auswählen

proc main
   local oTest, oTest2
   cls
   oTest := test():new()
   oTest:tuwas()
   wait
   oTest2 := test2():new()
   oTest2:tuwas()
   read
   ? "ENDE"
   wait


return

CLASS test
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENDCLASS
****************
METHOD test:tuwas()
             ::suchen()
RETURN self
****************
METHOD test:suchen()
             @ 5,1 SAY "Hallo"
RETURN self

CLASS test2
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENDCLASS
****************
METHOD test2:tuwas()
       local wusel := "    "
             @ 5, 2 GET wusel;
             VALID ::suchen()
RETURN self
****************
METHOD test2:suchen()
             @ 6,1 SAY "Hallo"
RETURN .t.
In diesem Code wird die Fehlermeldung ausgegeben:

Code: Alles auswählen


------------------------------------------------------------------------------
FEHLERPROTOKOLL von "C:\Temp\test.exe" Datum: 28.05.2006 01:02:49

Xbase++ Version     : Xbase++ (R) Version 1.82.294
Betriebssystem      : Windows 2000 05.00 Build 02195 Service Pack 4
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: B VALUE: {|| ::suchen()}
          -> VALTYPE: O CLASS: Get
oError:canDefault   : N
oError:canRetry     : J
oError:canSubstitute: N
oError:cargo        : NIL
oError:description  : Zugriff auf Methode nicht erlaubt
oError:filename     : 
oError:genCode      :         25
oError:operation    : suchen
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       2224
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          1
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von GETPOSTVALIDATE(307)
Aufgerufen von GETREADER(95)
Aufgerufen von READMODAL(58)
Aufgerufen von MAIN(9)
Wie leicht zu erkennen ist, wird beim READ der Codeblock von VALID aufgerufen, somit wird alles bis zum VALID ausgeführt, aber dann erfolgt der Aufruf
{|| ::suchen()} und somit der Fehler, denn ::suchen() wird nicht innerhalb der Methode sondern im Hauptprogramm aufgerufen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

da die Mails recht lang sind fange ich zum abgewandelten Beispiel eine neue an:

Code: Alles auswählen

proc main
   local oTest, oTest2
   cls
   oTest := test():new()
   oTest:tuwas()
   wait
   oTest2 := test2():new()
   oTest2:tuwas()
//   read
   ? "ENDE"
   wait


return

CLASS test
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENDCLASS
****************
METHOD test:tuwas()
             ::suchen()
RETURN self
****************
METHOD test:suchen()
             @ 5,1 SAY "Hallo"
RETURN self

CLASS test2
           EXPORTED:
           METHOD tuwas
           PROTECTED:
           METHOD suchen
ENDCLASS
****************
METHOD test2:tuwas()
       local wusel := "    "
             @ 5, 2 GET wusel;
             VALID ::suchen()
       read
RETURN self
****************
METHOD test2:suchen()
             @ 6,1 SAY "Hallo"
RETURN .t.
Jetzt habe ich das READ in die EXPORTED Routine gepackt, ändert sich was ? NEIN, auch hier wird der gleiche Fehler (mit anderer Zeilennummer) auftreten, denn das READ-OBJECT ruft wieder den Codeblock mit dem Verweis auf die protected Methode auf, auch wenn dieser durch READ und GET VALID in der Methode definiert wurden, aufgerufen wird es außerhalb in einem CODEBLOCK !
Weder READ noch ein CODEBLOCK gehören je zu der gleichen Methode !

Du hättest eine exportierte Methode aufrufen können und dort die protected, das wäre gegangen wie oben beim SAY Beispiel.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

hier noch eine Zusammenfassung, was prinzipiell problematisch ist:

@ GET / READ nutzt eine public Variable GETLIST := {}, solange du diese nicht als local definiert hast. Hier liegt eine große Gefahr, wenn 2 READ verschachtelt werden. In einem Programm mit mehreren Fenstern ist dies aber schnell möglich. Wenn du die GET und READ Befehle nicht innerhalb einer Methode erledigst, kannst du keine lokale GETLIST := {} verwenden !

Also aufpassen oder Ärger steht ins Haus...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

genau so, wie Du es oben dargestellt hast, ist es mit passiert. Das READ ist das Problem. Das hatte ich aber oben schon festgestellt, nur nicht als solches erkannt.
Ich wollte einfach nur ganz kurz nachfragen, ob ich mit dem Verständis des PROTECTED richtig lag und ob es von der Grundkonzeption so klappen müßte. Der Rest hätte hier den Rahmen gesprengt, weil doch etliches an Code dahintersteht.
Ich dachte, dass die Grundvoraussetzung klar wäre, bzw. das es nicht zu der Diskussion kommen würde, ob ich ein Objekt davon bilde und dann auch den Rest programmiert habe, sondern dass ich dass alles wohl tue.

Aber eigentlich habt ihr alle Recht gehabt, man soll schon wie im Straßenverkehr vorgehen und davon ausgehen, das der andere Fehler macht und ich daher vorsichtig sein muß. Ich habe ja schließlich schon recht dusselige Fehler von mir in den letzten Wochen hier zum Thema gemacht. :roll:

Für mich war es klar, das die PROTECTED METHODE aus der eigenen METHODE heraus aufgerufen wurde und somit einen erlaubten Zugriff haben muß, aber ich habe mal wieder nicht hinter die Kulissen geschaut, bzw. nicht tief genug.

Aber auch hier wieder einen großen Dank an Hubert, der sich mal wieder wie immer große Mühe gibt/gab um das Thema zu durchleuchten.

An die anderen natürlich, die jedesmal mit von der Partie sind. :-)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

es gibt Fragen über Sachen, die man selbst gerade oder vor kurzem durchgekaut hat und dort reicht ein kurzer Hinweis.
Wie sich PROTECTED: Vars und Methoden verhalten (sollten) hast du ja ganz am Anfang geschrieben und Martin hat es bestätigt.
Aus dem ersten Beispiel war auch nicht wirklich ein Problem erkennbar, erst das READ machte eines daraus ...

Nun ist es aber so, dass viele (ich auch) nicht mehr sehr viel mit READ machen und deshalb muss man sich den Quellcode und die Fehlermeldungen ansehen um sich wieder an die alten Probleme zu erinnern. :wink:

Im übrigen sind langjährige Clipperprogrammierer von der Windows (eventdriven) Programmierung anfangs leicht geschockt, aber die Probleme liegen dennoch selten einfach auf der Oberfläche.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

alles klar. Ich stecke noch zu tief in der Clipperprogrammierung drin, als dass ich die "neuen" Probleme sofort einsortieren kann.

Ich werde versuchen in Zukunft etwas deutlicher, oder ausführlicher zu fragen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,
Manfred hat geschrieben:Ich werde versuchen in Zukunft etwas deutlicher, oder ausführlicher zu fragen.
genauere Fragen bringen oft schneller bessere Antworten. :wink:

Wir wollen aber ausdrücklich nicht, dass sich jemand nicht traut eine Frage zu stellen, weil er fürchtet, dass die anderen diese Frage als doofe Frage empfinden. Dies ist und soll sein ein Anfänger freundliches Forum, und eine Frage ist nur dann eine doofe Frage, wenn der Fragesteller dies selbst so sieht :!:

Also nur Mut, wir freuen uns auf deine Fragen.

PS: Wer das anders sieht braucht ja nicht zu antworten. :wink:
Gruß
Hubert
Antworten