Seite 5 von 6

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 02.05.2017 01:14
von mk-soft
Zu A:
In dem Sinne gibt es kein Copy-Kontruktor. Was du wahrscheinlich meinst ist ein kopieren des Objekts.
Diese ist aber so komplex das die Objekt-Klasse die Methode Copy mitliefern muss. Um die BaseClass bei mir sauber in eine neues Objekt zu kopieren gibt es das Hilfs-Macro CloneObject(). Alles andere wie zum Beispiel ein Image zu kopieren muss in der Methode programmiert werden.

Zu B:
Die Reihenfolge von Dispose kann man ja mal ändern. Aber wie du sagst macht es in 99,9% der Fälle keinen Unterschied.

Deine Bezeichnung ParentClass und ChildClass finde ich nicht ganz passend. Nach einer Vererbung erhält man eine neue Objekt-Klasse welches nur die Methoden und Properties erworben hat. Jede Änderung an der neuen Objekt-Klasse darf an den Original der geerbten Klasse keinen Einfluss haben.

Den Begriff Parent verstehe ich als einen Verweis auf das übergeordnete Objekt welches das Objekt erzeugt hat. Die Methode Parent muss das Objekt liefern.

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 02.05.2017 04:45
von GPI
mk-soft hat geschrieben:Zu A:
In dem Sinne gibt es kein Copy-Kontruktor. Was du wahrscheinlich meinst ist ein kopieren des Objekts.
Diese ist aber so komplex das die Objekt-Klasse die Methode Copy mitliefern muss. Um die BaseClass bei mir sauber in eine neues Objekt zu kopieren gibt es das Hilfs-Macro CloneObject(). Alles andere wie zum Beispiel ein Image zu kopieren muss in der Methode programmiert werden.
Hmm... so schwer stell ich mir das nicht vor. Du musst nur eine weitere Liste, neben Initalize.udtInvoke() und Dispose.udtInvoke() führen. Das Image zu kopieren ist klar die Aufgabe der entsprechenden "SubClass". Aber dein Code sieht das bisher nicht so vor. Konstruktoren würde ich jetzt nicht zwingend als Methode bezeichnen. Sie sind zumindest eine Sonderstellung, gerade weil sie nicht überschrieben werden.
Die Reihenfolge von Dispose kann man ja mal ändern. Aber wie du sagst macht es in 99,9% der Fälle keinen Unterschied.
Ich mag so kleine Details. Es sind meist so kleinigkeiten, über die man nicht nachdenkt, aber irgendwann enorm wichtig werden könnten.
Deine Bezeichnung ParentClass und ChildClass finde ich nicht ganz passend. Nach einer Vererbung erhält man eine neue Objekt-Klasse welches nur die Methoden und Properties erworben hat. Jede Änderung an der neuen Objekt-Klasse darf an den Original der geerbten Klasse keinen Einfluss haben.

Den Begriff Parent verstehe ich als einen Verweis auf das übergeordnete Objekt welches das Objekt erzeugt hat. Die Methode Parent muss das Objekt liefern.
Scheint wohl beides zu geben, siehe Wikipedia https://de.wikipedia.org/wiki/Vererbung ... ammierung)
Die vererbende Klasse wird meist Basisklasse (auch Super-, Ober- oder Elternklasse) genannt, die erbende abgeleitete Klasse (auch Sub-, Unter- oder Kindklasse).
In englischen sind sie sich auch uneinige. Da wird an einer stelle von "Such an inherited class is called a subclass of its parent class or super class." und an anderer "A Subclass, "derived class", heir class, or child class"
Macht auch Sinn, man spricht ja von Vererbung :) Aber Super- und Subclass wären wohl eindeutiger

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 02.05.2017 15:06
von mk-soft
Ok.
Die Reihenfolge von Dispose habe ich jetzt geändert. War auch irgendwie auf meine ToDo liste.

Das mit Images, Fonts, etc hat bei mir nichts in der BaseClass zu suchen. Der Konstruktor (Initalize) bleibt bei mir nur zum anlegen eines neuen Objektes vorbehalten. Verliere sonst die Kompatibilität zu den Standards zum erstellen von Objekten.

Mein Ziel ist es immer noch mit Purebasic möglichst einfach ein Objekt zu erstellen und nicht eine neu Objektsprache zu implementieren.

Vielen Dank für Deine Anregungen die zu einen Update geführt haben. Auch gerade für mein Projekt BaseClass ClassDispatch zur Erstellung von COM-DLL´s.

Link ClassDispatch http://www.purebasic.fr/english/viewtop ... 12&t=68101

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 02.05.2017 15:06
von mk-soft
Update v1.29
- Dispose Object wird jetzt rückwärts verarbeitet.
- LinkedList Initalize() und Dispose() über Mutex geschützt da diese über alle Objekte der Klasse gemeinsam verwendet werden.
- ObjectCounter über alle Klassen hinzugefügt. Kann dazu verwendet werden um ein Programm oder eine DLL erst zu beenden wenn kein Object mehr referenziert ist.
(If BaseClass::Class\ObjectCounter = 0 ...)

:wink:

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 02.05.2017 15:38
von GPI
Ich hätte noch einen Vorschlag:

Code: Alles auswählen

Procedure __AddDisposeObject#Name()
      If FindMapElement(Class\Entry(), #PB_Compiler_Module)
        FirstElement(Class\Entry()\Dispose())
        InsertElement(Class\Entry()\Dispose())
        Class\Entry()\Dispose()\Invoke = @Name()
      Else
        Debug "Error: Class is not initialized. Module '" + #PB_Compiler_Module + "'!"
        CallDebugger
      EndIf
    EndProcedure : __AddDisposeObject#Name()
So wird die Liste gleich von Anfang an "Rückwärts" aufgebaut. So kann man mit einer einfachen ForEach-Next-Schleife alle Proceduren aufrufen.

Ich glaub du hast mich leicht missverstanden. Der Konstruktor ist nicht gleich der Kopie-Konstruktor. Das sind zwei paar Stiefel. Ist auch keine Erfindung von mir, sondern wird bspw. in C++ verwendet.
Die Images, Fonts etc. haben in der BaseClass natürlich nichts zu suchen, aber in einer eigenen Konstrukt. Wie wäre es bspw. mit einen Image-Objekt, das alle Funktionen zum manipulieren in Image enthält? Wenn man jetzt eine Kopie von den Objekt erstellen will, weil man bspw. die Größe ändern will (Thumbnail-Bild), aber das Original nicht verlieren will, dann wird ein Copy-Funktion sehr praktisch. Wenn man jetzt ein SubKlasse von dieser Image-Klasse erstellt, müsste man aktuell den komplette Copy-Methode neu schreiben. Mit einen Copy-Construktor-Ding wird das einfacher. Ist halt ein i-Tüpfelchen.

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 23.08.2017 13:11
von mk-soft
Update v1.31
- Rechtschreibkorrektur: Initalize -> Initialize

Sorry, ist mir bis nicht aufgefallen...

Eigene Projekte einfach mit 'Suchen und Ersetzen' korrigieren.

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 28.08.2017 11:29
von mk-soft
Update v1.32
- Geändert: Interne Initialize und Dispose von List auf Array geändert, zur Vermeidung von Thread-Blocking
- Hinzugefügt: Kurze Version von 'BaseClass' hinzugefügt 'Modul_BaseClassSmall'

:wink:

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 29.10.2017 10:27
von mk-soft
BaseClass small version

Update v1.05
- Now compatible to extended version
+ Macro AsNewMethode, Macro CloneObject

Immer noch der kleinste Code zur Erstellung von Objekts :wink:

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 22.12.2017 17:27
von mk-soft
Update v1.07
- Bugfix FreeMutex

Habe noch ein Bug gefunden. Bei Release Object wurde das Mutex nicht freigegeben

Link zum BaseClass

Re: Modul BaseClass (Modul als Objekt)

Verfasst: 25.01.2018 16:31
von mk-soft
Neue Version der BaseClassSmall :wink:

Update v1.09r3
- Die Klassen im Modul 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'