Seite 5 von 5

Verfasst: Mo, 31. Dez 2007 16:38
von Manfred
und weiter gehts...

ich arbeite mich langsam voran.

Wenn ich ein SLE von SLEPic erben lasse, dann wird doch die Keyboard Methode des XBPSLE von der von SLEPic überladen!?

Wenn ich jetzt auch noch meinem von SLEPic erbenden Objekt ein

Code: Alles auswählen

objekt := SLEPic():new()
objekt:create()
objekt:keyboard := {|nKey,x,o| tasten(o)}
überlade ich dann noch was, oder was passiert dann? Ich habe gerade festgestellt, dass zuerst die SLEPic Methode und danach die von mir geschriebene aufgerufen wird. Das paßt mir natürlich jetzt gut in den Kram, aber was geht da vor sich? Oder verwechsel ich hier etwas?

Verfasst: Mo, 31. Dez 2007 16:46
von Martin Altmann
Hallo Manfred,
eigentlich müsste Dein :keyboard-slot vor dem :create zugewiesen werden.
Und wenn Du dann auch den :keyboard-slot Deiner Superklasse aufrufen willst, so müsstest Du das dann in Deiner Funktion tasten() machen...

Viele Grüße,
Martin

Verfasst: Mo, 31. Dez 2007 16:48
von Manfred
Sorry Martin,

wird auch vor dem create() zugewiesen.

Aber die Reihenfolge ist wirklich so, wie ich es schrieb. Erst kommt der von SLEPic und dann mein eigener. Ohne etwas extra anzugeben.

Verfasst: Di, 22. Jul 2008 12:56
von Manfred
Hi,

es geht weiter.

Mit dem HIDDEN, das verstehe ich auch noch nicht bis ins kleinste Detail.
1) Deklaration einer HIDDEN VAR in der Superklasse
2) Aufruf einer Superklassenmethode über eine Instanz
3) dann Aufruf aus dieser Methode einer Superklassenmethode
4) die HIDDEN Var ist nicht bekannt.

Wo denke ich hier falsch? Ruft die Superklassenmethode nicht eine Superklassenmethode auf und sollte deshalb die HIDDEN Var kennen?

Verfasst: Di, 22. Jul 2008 13:49
von brandelh
Hallo Manfred,

HIDDEN ist genau dafür da, dass NUR genau diese Ebene darauf zugreifen kann. Keine SUPER und keine ABGELEITETEN !

Im Prinzip wie eine LOCAL, nur dass die eigenen Methoden darauf zugreifen können.

Verfasst: Di, 22. Jul 2008 13:57
von Manfred
Hi Hubert,

eigentlich alles klar, aber ich kriege es nicht unter einen Hut.

Code: Alles auswählen

class test
   HIDDEN
   VAR iVar

   EXPORTED:
    method eins, zwei
endclass

method test:eins()
      ::zwei()
return self

method test:zwei()
       ::iVar := 1
return self

procedure main()
     probe := test():new()

     probe:eins()
return
So müßte es sein, was ich in etwa machen möchte. Das klappt aber nicht. Wie soll ich denn sonst die Methode aufrufen, wenn nicht so? Irgendwer muß doch das Recht haben iVar anzusprechen.

Es ist jetzt nur ein Test, die Lösung mit iVar muß jetzt nicht so sein. Ich wollte nur testen was passiert. Und jetzt verstehe ich das Ergebnis nicht so ganz.

Verfasst: Di, 22. Jul 2008 14:14
von brandelh
Hallo Manfred,

ich vermute du erhälst die Fehlermeldung in dieser Zeile:

Code: Alles auswählen

procedure main() 
     probe := test():new() 

[color=red]     probe:eins() [/color]
return 
und warum ?

Code: Alles auswählen

class test 
   HIDDEN 
   VAR iVar 

    method eins, zwei 
endclass 
Erstens ist nicht nur deine iVar hidden, sondern auch deine Methoden ...
wer in MAIN oder sonst wo

Code: Alles auswählen

oObject:Methode()  
oder

Code: Alles auswählen

oObject:iVar
aufrufen will, muss diese von außen zugänglich machen, also EXPORTED !

Der Code z.B. ist völlig OK:

Code: Alles auswählen

method test:zwei() 
       ::iVar := 1 
return self 
innerhalb von einer Methode von test darf man auf hidden Variablen und Methoden zugreifen. Auch z.B. das wäre OK:

Code: Alles auswählen

method test:zwei() 
       ::iVar := 1 
       ::eins()
return self 

Verfasst: Di, 22. Jul 2008 14:42
von Manfred
Sorry Hubert,

ich Pappnase. Habe es 3x durchgelesen und 3x überlesen. Natürlich sind die Methoden Exported.

Ich habe es geändert.

Verfasst: Di, 22. Jul 2008 14:48
von brandelh
Hi,

laut DOKU ist HIDDEN standard, also wenn du nichts reinschreibst, wirds auch HIDDEN.

Verfasst: Di, 22. Jul 2008 14:54
von Manfred
ja, öhm,

aber ich verstehe die Aussage von Dir jetzt nicht.

Die Var ist Hidden, die Methoden nicht.

Verfasst: Di, 22. Jul 2008 15:06
von brandelh
Hallo Manfred,

ich meinte folgendes:

Code: Alles auswählen

class test 
   HIDDEN:
   VAR iVar 

   EXPORTED: 
    method eins, zwei 
endclass
und

Code: Alles auswählen

class test 
   VAR iVar 

   EXPORTED: 
    method eins, zwei 
endclass
sind identisch, da weder EXPORTED: noch PROTECTED: definiert wurde, nimmt der compiler HIDDEN: an.
Das wäre z.B. alles HIDDEN:

Code: Alles auswählen

class test 
   VAR iVar 
    method eins, zwei 
endclass
nun sehe ich aber auch, dass du oben dein Beispiel geändert hast ... damit versteht natürlich niemand mehr um was es hier eigentlich ging ;-)
und ich weiß nun auch nicht ob deine Frage geklärt oder immer noch offen ist :?

Verfasst: Di, 22. Jul 2008 16:04
von Manfred
Hi Hubert,

wir sind wie ein altes Ehepaar: wir reden gerne aneinander vorbei :lol: :lol:

Ich hatte ja erwähnt, dass ich es falsch aufgeschrieben hatte. Und selbst bei mehrmaligem Lesen es mir nicht aufgefallen war, das ich es vergessen habe.

Also das Problem ist nicht aus der Welt. Ich verstehe nicht, warum es nicht klappt.

Verfasst: Di, 22. Jul 2008 17:41
von brandelh
Hallo Manfred,

dann solltest du mal die Fehlermeldung und den Quellcode der dazu führt (inkl. Zeilennummern) veröffentlichen, damit wir sehen können was er anmeckert.

Verfasst: Di, 22. Jul 2008 17:47
von Manfred
Hi Hubert,

Du hast Recht. Es ist mir entfallen, weil es in einer eigenen Routine landet und die sagt nur, das es gekracht hat. Aber die Meldung besagt: Zugriff auf Member Variable nicht erlaubt.