Seite 3 von 4
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 28.06.2022 15:04
von Olafmagne
Jep,
Das Meine ich damit.
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 28.06.2022 16:13
von Olafmagne
Ich glaube, damit kann ich leben.
Habe den Code von Stargate in ein Module gepackt, und kann jetzt auch den Constructor integrieren
und habe private Functionen und Variablen!
Code: Alles auswählen
DeclareModule Vctr
;- Interface
Structure VectorBuffer ; Struktur welche den Methodenpointer und Eigenschaften enthält
*Methods
X.f
Y.f
EndStructure
Interface Vector ; Interface welches später genutzt werden kann
Set(X.f, Y.f)
Get.s()
Length.f()
Add(*Vector)
Free()
EndInterface
Declare.i NewVector()
EndDeclareModule
Module Vctr
;- Medoden
Define count.i
Procedure setcount(c.i)
Shared count
count+c
Debug "Anzahl = "+Str(count)
EndProcedure
Procedure.i getcount()
Shared count
Debug "Anzahl = "+Str(count)
ProcedureReturn count
EndProcedure
Procedure Vector_Set(*This.VectorBuffer, X.f, Y.f)
*This\X = X
*This\Y = Y
ProcedureReturn *This
EndProcedure
Procedure.f Vector_Length(*This.VectorBuffer)
ProcedureReturn Sqr(*This\X**This\X+*This\Y**This\Y)
EndProcedure
Procedure.s Vector_Get(*This.VectorBuffer)
ProcedureReturn StrF(*This\X)+" , "+StrF(*This\Y)
EndProcedure
Procedure.i Vector_Add(*This.VectorBuffer, *Vector.VectorBuffer)
*This\X + *Vector\X
*This\Y + *Vector\Y
ProcedureReturn *This
EndProcedure
Procedure.i Vector_Free(*This.VectorBuffer)
FreeStructure(*This)
setcount(-1)
ProcedureReturn #Null
EndProcedure
Procedure.i NewVector()
Protected *This.VectorBuffer = AllocateStructure(VectorBuffer) ; Buffer für die Struktur erzeugen und Methodenpointer setzen
*This\Methods = ?Vector_Methods
setcount(1)
; Ggf. andere Strukturfelder setzen
ProcedureReturn *This
EndProcedure
DataSection
Vector_Methods:
Data.i @Vector_Set()
Data.i @Vector_Get()
Data.i @Vector_Length()
Data.i @Vector_Add()
Data.i @Vector_Free()
EndDataSection
EndModule
UseModule Vctr
;- Beispiel
Define A.Vector = NewVector()
Define B.Vector = NewVector()
A\Set(4, 3)
Debug A\Length()
B\Set(-1, 2)
A\Add(B)
Debug A\Get()
B\Free()
A\Free()
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 29.06.2022 19:08
von Olafmagne
Habe diese Nacht noch ein wenig im Forum gestöbert zu dem Thema,
und bin bei Tutorial auf ein Tutorial von MK-Soft gestossen, das eben genau
diesen Ansatz beschreibt
Kleiner OOP Kurs mit Purebasic. Ohne Macros und PreCompilers
sogar mit Vererbung!
Danke an Stargate für die Erklärung des Interfaces
und an MK-Soft für das Tutorial
Damit sind erst mal alle Fragen geklärt!
Olaf
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 29.06.2022 19:33
von NicTheQuick
Ich habe übrigens auch mal sowas gemacht:
viewtopic.php?t=30902
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 29.06.2022 19:52
von mk-soft
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 29.06.2022 21:02
von Olafmagne
Werde die Nacht erst mal lesen
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 17.07.2022 14:52
von Olafmagne
Nachdem ich nun eine Weile mit den "Klassen" gespielt habe, gibt es etwas, das ich nicht verstehe.
Es ist doch so:
Eine Procedurendeclaration hat folgendes Schema:
Das ganze jetzt in der Klasse sieht so aus
Aufgerufen wird die Procedure aber ohne den *This-Pointer!
Warum wird das so vom Compiler akzeptiert?
Eigentlich kann ich einen Parameter nicht überspringen beim aufrufen, es müsste doch einen Fehler wegen
Fehler in der Parameteranzahl beim Aufrufer auslösen?
Ok, es Funktioniert, Ich würde nur gerne wissen, warum? Was ist der interne Grund dafür?
Merci Olaf
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 17.07.2022 16:15
von mk-soft
Lies mal meine Beschreibung von meinen OOP BaseClass.
Bei einer Methode ist der erste Parameter immer der Zeiger auf das eigene Objekt. Dieser wird automatisch vom Kompiler beim Aufruf der Methode eingesetzt.
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 17.07.2022 16:17
von Olafmagne
OK, sowas dachte ich mir schon, geht das auch mit weiteren Parameter, oder nur mit dem *This Zeiger
Re: Interfaces-Beispiel in der Hilfe korrekt?
Verfasst: 17.07.2022 17:54
von mk-soft
Die weiteren Parameter kannst du wie gewohnt als Optional definieren
' MethodeName(*this.sClass, default = 0)'