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:

Code: Alles auswählen

Declare PrintInfo(info$,n=0)
Das ganze jetzt in der Klasse sieht so aus

Code: Alles auswählen

 PrintInfo(*This.<class>,info$,n=0)
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)'