Interfaces-Beispiel in der Hilfe korrekt?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von jacdelad »

Das Interfaces-Beispiel aus der Hilfe:

Code: Alles auswählen

  ; Um auf ein externes Objekt (in einer DLL zum Beispiel) zugreifen zu
  ; können, muss zuerst das Objekt-Interface deklariert werden:
  ;
  Interface MyObject
    Move(x,y)
    MoveF(x.f,y.f)
    Destroy()
  EndInterface
  
  ; CreateObject ist die Funktion, welche das Objekt (aus der DLL) erstellt,
  ; dessen Interface gerade definiert wurde.
  ; Erstelle das erste Objekt...
  ;
  Object1.MyObject = MyCreateObject()
  
  ; Und das zweite.
  ;
  Object2.MyObject = MyCreateObject()
  
  ; Dann können die gerade definierten Funktionen verwendet werden,
  ; um auf das gewünschte Objekt zuzugreifen.
  ;
  Object1\Move(10, 20)
  Object1\Destroy()
  
  Object2\MoveF(10.5, 20.1)
  Object2\Destroy()

ist nicht benutzbar. Ich vermute mal, dass mir die hypothetische DLL dazu fehlt?

Müsste die Zeile

Code: Alles auswählen

Object1.MyObject = MyCreateObject()
gemäß dem Kommentar nicht eigentlich

Code: Alles auswählen

Object1.MyObject = CreateObject()
heißen?

Kann mir vielleicht jemand ein funktionierendes Beispiel zeigen?
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von NicTheQuick »

Das ist nur ein Pseudocode. Wenn du keine DLL dazu hast, funktioniert der so natürlich nicht. Das Beispiel soll nur aufzeigen wie in etwa du mit Interfaces umzugehen hast.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von STARGÅTE »

Ich glaube das Interface-Code-Beispiel in der Hilfe ist auch nicht zum ausführen, sondern stellt nur plakativ da wie das Konzept ist.
Hilfreich fand ich das auch nicht.

Hier mal ein Beispiel wie das aussehen könnte:

Code: Alles auswählen


;- 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

;- Medoden

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)
	ProcedureReturn #Null
EndProcedure

Procedure.i NewVector()
	Protected *This.VectorBuffer = AllocateStructure(VectorBuffer) ; Buffer für die Struktur erzeugen und Methodenpointer setzen
	*This\Methods = ?Vector_Methods
	; Ggf. andere Strukturfelder setzen
	ProcedureReturn *This
EndProcedure


;- 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()


DataSection
	Vector_Methods:
	Data.i @Vector_Set()
	Data.i @Vector_Get()
	Data.i @Vector_Length()
	Data.i @Vector_Add()
	Data.i @Vector_Free()
EndDataSection
Zuletzt geändert von STARGÅTE am 30.11.2021 13:50, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von NicTheQuick »

@STARGÅTE: Ich hätte noch einen Verbesserungsvorschlag, auch wenn es in deinem Beispiel keinen Unterschied macht: Statt AllocateMemory() würde ich AllocateStructure() nutzen. Dann funktioniert es auch gleich sauber, wenn man noch dynamische Arrays, Maps und LinkedLists in der Structure hat.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von STARGÅTE »

Guter Punkt, hab es angepasst.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von mk-soft »

Etwas älter, aber ...
Link: Kleiner OOP Kurs mit Purebasic
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von jacdelad »

Hm, ich glaube, dass ich es verstanden habe. Ich verstehe nur nicht, warum alle Welt so darauf abfährt?! Was kann ich damit machen, was ich sonst nicht kann (abgesehen von Zugriffen auf COM-Objekte etc., die das eben voraussetzen)?
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von TroaX »

Meinst du generell die Objektorientierung?
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von STARGÅTE »

jacdelad hat geschrieben: 01.12.2021 03:01 Hm, ich glaube, dass ich es verstanden habe. Ich verstehe nur nicht, warum alle Welt so darauf abfährt?! Was kann ich damit machen, was ich sonst nicht kann (abgesehen von Zugriffen auf COM-Objekte etc., die das eben voraussetzen)?
:lol: Die klassische Kluft zwischen prozedualer und objektorientierter Programmierung.
Meiner Meinung nach geht es dabei auch nicht um "was man machen kann" und "was man nicht machen kann",
es geht mehr um die Art und Weise "wie man es macht" und wie man sein Projekt strukturieren möchte.
Wie soll der Zugriffs- und Sichtbarkeitsbereich von Funktionen/Prozeduren/Methoden sein.
Willst du das Objekt in den Vordergrund stellen (welches Methoden aufruft) oder willst du die Prozeduren in den Vordergrund stellen (welche Objekte fressen). So mal mein sehr herunter gebrochenes Bild ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Captn. Jinguji
Beiträge: 395
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: Interfaces-Beispiel in der Hilfe korrekt?

Beitrag von Captn. Jinguji »

JacdeLad,
wenn Du Dir aus "PB-Startposition" schnell mal OO aufreißen möchtest, kannst Du Dir eigentlich schon direkt dieses BlitzMax Tutorial anschauen
https://blitzmax.org/docs/en/tutorials/oop_tutorial/
und wirst es ohne viel Aufwand wohl direkt(!) verstehen, wir ich Dich einschätze. Die Vorteile von OO kommen in dem Tutorial recht lebendig, nicht lehrbuchhaft, herüber.

BlitzMax ist praktisch so, wie ein echtes OO-PureBasic aussehen würde
und hat die gleichen Vorteile:
* kein großes Gefummel (das sind - glaube ich - die Dinge, die C++ Neulinge am meisten stören, auch wenn sie eher trivial sind) mit
* "{ }" oder
* vergessenen ";" an Zeilenenden),
* die Sources sind caseless wie bei PB.

Blitzmax hat schon vor Jahren das gemacht, was PB jetzt macht, also MINGW als CompilerBackend eingebaut. Ich will hier aber nicht groß Werbung dafür machen, nur betonen, dass WENN man von PB kommt und OO machen will (ohne gesonderten Precompile/Include), man sich mit BlitzMax am leichtesten tun wird.

Das Tutorial enthält allerdings zwei ärgerliche Fehler für die "Private" und "Protected" Keywords, die im Tutorial so beschrieben werden,
wie sie für C++ gelten, aber in BlitzMax anders implementiert sind ( dieses "Protected" ist aber ein anderes als das PB - "Protected" ); ansonsten
ist es ein gute Tutorial.

Klar, C++ bietet letztlich noch mehr ( "Templates" etc.etc. pp.), aber das braucht man am Anfang sicher nicht.

Just my 2 cents
Ist das Kunst hier, oder kann das weg ?
Antworten