Habe lediglich die Zeit mir kurz deine Beispiele anzusehen und kann daher jetzt nur was zur OOP Syntax sagen.
Code: Alles auswählen
Class IMessageBox
Private
; Dies sind die Daten der Klasse.
Attribute
Title.s
Text.s
Flag.l
EndAttribute
EndPrivate
Public
; Eine Methode kann genauso wie eine Procedure genutzt werden.
; Um etwas zurückzugeben ist der Befehl MethodeReturn zuständig.
Methode SetTitle(String$)
*this\Title = String$
EndMethode
; Diese Procedure ist besonders. Sie wird bei der
; Klassenerstellung aufgerufen. Sie enthält keine Parameter.
; Diese Funktion wird bei Vererbung im moment nur von der
; Haupt-Klasse benutzt. Dies wird aber noch geändert.
Methode CreateClass()
Debug "Create IMessageBox"
EndMethode
Methode SetText(String$)
*this\Text = String$
EndMethode
Methode.l FastMessage(Title$,Text$)
; Hier wird auf eine Methode in dieser Klasse zugegriffen.
; Dies kann auch verwendet werden, wenn die angegebene
; Methode noch nicht Declamiert wurde.
IThis\SetTitle(Title$)
IThis\SetText (Text$)
MethodeReturn IThis\Show()
EndMethode
Methode.l Show()
MethodeReturn MessageRequester(*this\Title,*this\Text,*this\Flag)
EndMethode
EndPublic
EndClass
Schaue dir mal die Syntax an, welche bei Edels OOP Plugin genutzt wird.
Ist übersichtlicher und unkomplizierter:
a) Nach Private bräuchte kein EndPrivate stehen, der Parser erkennt das Ende der Privaten Elemente und Methoden wenn sodann ein "Public" auftaucht oder ein "EndClass" daherkommt.
b) Ich sehe alle Methoden werden innerhalb der Classenerstellung "definiert".
Kann ich diese nicht auch innerhalb der Klasse deklarieren und separat ausserhalb der Klassenerstellung definieren?
Somit hast du eine übersichtliche Klasse mit der deklaration aller Elemente/Attribute und Methoden. Die Definition der Methoden könnten sodann zusätzlich auch (wie man eben will) ausserhalbd er Klasse definiert werden.
c) Warum immer Methode/EndMethode und Attribute/EndAttribute?
Der Parser könnte fix erkennen ob es sich in der Zeile um ein Element oder eine Methode handelt, welche da deklariert wird. (Logik wie bei C++)
Somit wäre so etwas übersichtlicher:
Code: Alles auswählen
Class IMyClass
Public
EinElement.l
AuchEinElement.f
DiesElement.b
DieseMethode(a.l, b.l, c.l)
JeneMethode(a.l, b.l, c.l)
EineMethode(a.l, b.l, c.l)
Private
DiesesLong.l
JenesByte.b
NochEinLong.l
EndClass
Jetzt die Definition der Methoden und anstatt des *this\xxxx ein ->xxxx (das *this\xxx könnte weiterhin akzeptiert werden um kompatibel mit bestehenden OOP Codes zu sein) zudem kann der Parser am "::" erkennen, dass es sich um die Definition einer Methode handelt.
Code: Alles auswählen
Procedure IMyClass::DieseMethode(a.l, b.l, c.l)
->DiesesLong = a * b
If c > 0
ProcedureReturn ->DiesesLong/c
Else
ProcedureReturn #False
EndProcedure
Somit wärst du in der Schreibweise (imho) kompatibel mit dem bereits vorhandenen OOP Plugin un die Leutz welche schon Code hinter sich gelegt ahben müssen nicht alles neu tippen - denn das hemmt.
Jetzt zur Vererbung vs. Hierarchie.
Dies in deinem Beispiel sehe ich als Vererbung:
Und dies meine ich mit Hierarchie, also eine "Klasse" innerhalb einer "Klasse" ohne die von dir genutzte "Struktur":
Code: Alles auswählen
Class IWavePlay
....
StopPlayback()
......
Buffer.IWaveBuffer[4]
....
.....
.....
EndClass
...
.
....
...
;Hier die Definitionen der Methoden, etc. etc., der Konstruktor etc etc etc
IWavePlay\Buffer[2]\Flush()
IWavePlay\StopPlayback()