Seite 1 von 1

OOP

Verfasst: Mo, 13. Aug 2018 8:37
von littlea1991
Guten Morgen Liebe Forenmitglieder,

ich bin gerade dabei zu verstehen wie genau Objektorientierte Programmierung in Xbase++ abläuft. Ich weiß das ich mit Objekt1 := Klasse1:New() eine Objekt der Klasse kreieren kann. Allerdings schlägt der Aufruf fehl, wenn ich den Code nur ausführen will innerhalb eines XbPPushButton Activates.

Ich habe eine Klasse in einer PRG Datei:

Code: Alles auswählen

CLASS Primzahl
   EXPORTED:
      METHOD init
ENDCLASS


METHOD init()

MsgBox("test")

Return self

und würde gerne auf den Code meiner Klasse innerhalb einer anderen Klasse in deren Methoden darauf zugreifen.

Code: Alles auswählen


******************************************************************************
METHOD NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   * Methode der Superklasse rufen
   ::_NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   oPrimZahl := Primzahl():New()
   oPrimZahl:init()  //<-- Hier funktioniert der aufruf

   ::ende:activate  := {|| ::anfangsBereich:clear(), ::endBereich:clear(), ::ausgabeFeld:clear()} //XbPushButton Event
   ::start:activate :={||  oPrimZahl:init() } // <-- Hier kommt der Fehler (XbpPushButton Event)
   * Formular anzeigen
   ::show()


RETURN self

im unteren Versuch den gleichen Befehl aufzurufen, kommt die Fehlermeldung: "Member-Variable ist für dieses Objekt unbekannt"

während weiter Oben der aufruf ganz Normal funktioniert. Ich kenne es normalerweise in Java, das wenn ich ein Objekt einer Klasse kreiere, ich danach den vollen Zugriff auf die Methoden der Klasse habe. Habe ich da was falsch verstanden? Würde man das in Xbase anders implementieren?
Ich habe mir überlegt auch eine dritte Testklasse zu schreiben mit einer Main Methode die die Objekte Klasse NewForm (Kreiert vom Form Designer Class Code) und der Klasse Primzahl kreiert und ihre Methoden aufruft.
Die Klassen sind alle in einzelnen *.PRGs abgespeichert worden.

Vielen lieben Dank im vorraus für eure Antworten!

Gruß

Ali

Re: OOP

Verfasst: Mo, 13. Aug 2018 8:54
von Martin Altmann
Moin,
ein :new() ruft das :init() implizit auf.
Du solltest in deiner Primzahlklasse die Methode zum Ausgeben deiner MsgBox anders nennen.

Viele Grüße,
Martin

Re: OOP

Verfasst: Mo, 13. Aug 2018 9:21
von littlea1991
ah Danke für den Hinweis! Ich habe jetzt die Methode anders genannt, weißt du vielleicht warum der Fehler "Member-Variable ist für dieses Objekt unbekannt" weiter unten im ::Start:Activate{} Block auftaucht? Ich rufe den gleichen Code weiter oben auf und er funktioniert ganz gut, dazwischen wird ja nichts am Objekt verändert. Oder rufe ich es einfach falsch auf im Activate{} Block?

Gruß

Ali

Re: OOP

Verfasst: Mo, 13. Aug 2018 9:27
von Martin Altmann
Moin,
es geht bei der Fehlermeldung um deine private oPrimzahl - die ist zum Zeitpunkt des :create() deiner NewForm bekannt. Aber nur dann! Du belegst dort einen :activate-Slot, der erst „schießt“, wenn das entsprechende Event eintritt (Klick auf den Button). Dort ist deine private aber nicht mehr bekannt.
Du solltest also in der Klasse eine Membervar erzeugen (z.B. oPrimzahl) und diese dann benutzen (also ::oPrimzahl)

Viele Grüße,
Martin

Re: OOP

Verfasst: Mo, 13. Aug 2018 11:18
von AUGE_OHR
moin,
littlea1991 hat geschrieben: Mo, 13. Aug 2018 8:37

Code: Alles auswählen

METHOD NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::start:activate :={||  oPrimZahl:init() } // <-- Hier kommt der Fehler (XbpPushButton Event)
in ::Start:activate gibst du dein Prim-Zahlen Modul ein was ausgeführt werden soll ( o:MachMal() ).
ich nehme an das ::anfangsBereich und ::endBereich die Werte für den Ablauf enthalten soll
bei ::AusgabeFeld gehe ich davon aus das es deine Listbox() sei die du mit Werten füllen willst

Code: Alles auswählen

   ::start:activate :={|| oPrimZahl:MachMal(::anfangsBereich,::endBereich,::ausgabeFeld) } 

CLASS Primzahl
   EXPORTED:
      METHOD init
      METHOD MachMal()
ENDCLASS

METHOD Primzahl:MachMal(oAnfangsBereich,oEndBereich,oAusgabeFeld)
LOCAL nStart := VAL(oAnfangsBereich:Getdata() )
LOCAL nEnde  := VAL(oEndBereich:Getdata()     )
   // hier dein Prim-Zahlen Code
   ...
  
   // Listbox() füttern
   oAusgabeFeld:AddItem(cText) 
Return self
in einem SLE wird mit o:GetData() "gelesen = GET" ( o:SetData() ist zum "setzten = SAY" )
da man IMMER ein String erhält mit man ihn noch mit VAL() in eine Nummer umwandeln

Re: OOP

Verfasst: Mo, 13. Aug 2018 14:10
von littlea1991
super! Das hat jetzt auch so geklappt! Was ich sehr interessant finde ist das eine Klasse auch von mehreren anderen Erben kann. (somit kann man ganz ohne Interfaces arbeiten, wie man die von Java so kennt) Vielen Dank noch einmal für eure Hilfe!

Gruß

Ali