Stelle aber fest das es auch ohne Pre-Compiler zu lösen ist.
Mein Ziel ist es ohne viele neuen Schlüsselnamen ein Modul als ein Objekt zu programmieren . Ich glaube es ist mir gelungen.
Das Modul BaseClass bringt dazu alle erforderlichen Komponenten mit:
- Neue Klasse anlegen mit der BaseClass oder einer geerbten Klasse.
- Die Basisfunktion Object\Release() und Object\AddRef().
- Deklarierung von Aufruf Umgebung "Initalize" und "Dispose", auch bei Vererbung.
- Deklarierung von Methoden.
Es gibt nur wenige Regeln:
- Die Struktur für die Variablen (Properties) muss mit "Extends sBaseClass" oder mit "Extends sVererbung" definiert werden.
- Das Interface für die Methoden muss mit "Extends iBaseClass" oder mit "Extends iVererbung" definiert werden.
- Bei Vererbung muss die zu erbende Klasse eine BaseClass haben.
Update v1.07
- Bugfix FreeMutex
Update v1.08
- Die Klassen in der Procedure 'AddClass(...)' gekapselt
- Überprüfung der neuen Klasse in der Procedure 'AddClass(...)' erweitert
- Macros geändert da die Klassen nicht mehr global sind
- Geändert CheckInterface. Der Parameter wird nicht mehr benötigt
- Die Namen der Klassen sind nicht mehr 'Case Sensitive'
Update v1.10
- Geändert ClassName Management
Update v1.13
- CheckInterface optimiert
Update v1.15
- QueryInterface aktuallisiert
Update v1.16
- Update Method QueryInterface with default result for 'IUnknown'
- Optimize BaseClass
Modul_BaseClassSmall.pb
Code: Alles auswählen
; Siehe englisches Forum
Beschreibung vom Modul BaseClassSmall
Update v1.13
Vorwort
Purebasic ist Procedure Orientiert. Unterstützt aber den Aufruf von Objekten.
Mein Ziel ist es nicht eine Objekt orientierte Sprache für Purebasic zu erstellen, sondern das anlegen von eigenen Objekten zu vereinfachen.
Für vollständige Unterstützung von Objekt orientierte Programmierung gibt es andere Programmiersprachen.
Bei machen Aufgaben ist es aber vom Vorteil diese objektorientiert anzulegen.
Hier gilt bei Purebasic der gleiche Aufwand wie zum Beispiel bei „C“.
Alles muss selber definiert und anlegen werden. Es müssen die Regeln für Objekte und der Funktionen und Methoden eingehalten werde.
1. Der erste Eintrag im Objekt ist immer der Zeiger auf die Tabelle mit den Methoden.
2. Der erste Parameter von den Methoden ist immer der Zeiger auf das eigene Objekt.
Klassen
Zum anlegen eines Objektes benötigt man ein Klasse.
Eine Klasse kann man auch den Datentyp eines Objekt nennen.
In diesen wird die Tabelle der Methoden (Funktionen) und der Attribute (Variablen) definiert.
Konstruktoren und Destruktoren
Konstruktoren sind Funktionen die beim anlegen des Objekt in einen definierten Zustand bringen und bei bedarf die erforderliche Ressourcen anlegen.
Destruktoren sind Funktionen die beim freigeben des Objekt die angelegen Ressourcen frei gibt.
Konstruktoren können auch Parameter haben, werden aber nicht von alle Programmiersprachen unterstützen.
Destruktoren haben keine Parameter.
Konstruktoren und Destruktoren haben keinen Rückgabewert.
Methode Super
Um eine Klasse oder auch Basisklasse genannt zu vererben, benötigt man eine Super Funktion welche die Methoden und Attribute an die Subklasse übergibt.
Hierzu gehören auch die Konstruktoren und Destruktoren der Basisklasse.
Bei mehrfache Vererbung kann es somit auch mehrere Konstruktoren und Destruktoren geben, die in der richtigen Reihenfolge aufgerufen werden müssen.
Interface
Interfaces definieren die Schnittstelle welche Methoden vorhanden sind oder vorhanden sein müssen.
Was unterstützt Purebasic
Purebasic unterstützt Interfaces und Attributen, sowie die Vererbung von Interfaces und Attributen
- Interface SubKlasse Extends BasisKlasse
- Structure SubAttribute Extends BasisAttribute
Aufruf der Methoden von dem Interfaces.
Was unterstützt das Modul BaseClassSmall
Anlegen und Verwalten von Klassen : NewClass(InterfaceName, …)
- Anlegen der Tabellen für Methoden, Konstruktoren und Destruktoren.
* Hinweis: Konstruktoren mit Parameter werden nicht unterstützt.
- Die Methode Super automatisiert.
Das Interface mit den Methoden von Typ IUnknown
- QueryInterface(*riid, *addr)
- AddRef()
- Release()
Die BasisAttribute mit der Struktur
- System\vTable : Zeiger auf die Methoden-Tabelle
- System\Self : Zeiger auf die Klasse mit den Tabellen der Methoden, Konstruktoren und Destruktoren.
- System\RefCount : Zähler zum schützen von dem Objekt
- System\Mutex : Mutex für asynchrone Bearbeitung vom dem Objekt
Zuweisung des Kontruktors : Macro AsInitializeObject(Name der Procedure)
Zuweisung des Destruktors : Macro AsDisposeObject(Name der Procedure)
Zuweisung der Methoden : Macro AsMethode(Name der Methode und Procedure)
Überschreiben der Methoden : Macro AsNewMethode(Name der Methode und Procedure)
Anlegen des Objekt : Macro InitObject oder AllocateObject/InitializeObject für die Procedure zum angelegen des Objekt
- Anlegen des Speichers für das Objekt.
- Zuweisung der Virtuellen Tabelle und Basis Attribute.
- Aufruf der Konstruktoren in der richtigen Reihenfolge.
Die Methode QueryInterface : Object\QuerInterface(*riid, *addr)
- Eine leere Methode mit den Rückgabewert #E_NOINTERFACE.
* Diese Methode kann bei bedarf überschrieben werden.
Die Methode AddRef : Object\AddRef()
- Erhöhung des Zählers des Objektes.
* Mit der Methode Release wird der Zähler reduziert und das Objekt wird erst freigegeben, wenn dieser Null erreicht hat.
! Nicht überschreiben !
Die Methode Release : Objekt\Release()
- Aufruf der Destruktoren in der richtigen Reihenfolge.
- Freigeben des Speichers.
! Nicht überschreiben !
Überprüfung der Klasse im Debugger-Modus
- CheckInterface() am Ende vom Modul aufrufen.