CLASS VAR SHARED in INITCLASS [ERLEDIGT]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

CLASS VAR SHARED in INITCLASS [ERLEDIGT]

Beitrag von Manfred »

Ich fange mal ein altes Thema der Übersicht wegen neu an.

Es geht um die berühmte Class Var, die in der Initclass gesetzt wird.

ist jetzt verkürzt, nur damit ihr versteht, was ich meine.

Code: Alles auswählen

class datenbank
       CLASS METHOD initClass
       CLASS VAR aDb SHARED
       CLASS VAR oId SHARED
endclass

CLASS METHOD datenbank:initclass()
      IF ::aDb == NIL
         ::aDb := {}
         ::oId := ids():new()
         ::oId:db_oeffnen(,,,.F.)
      ENDIF
RETURN self
Die initclass wird ja nur 1x zu Anfang aufgerufen, um eben besagte Vars zu belegen und dann eben für alle Instanzen den gleichen Wert zu haben. Jetzt hatte ich mir gedacht, da ich eine Db habe in der alle ID gespeichert werden, könnte die auch da rein und einmal geöffnet wäre sie dann für alle weiteren Db vorhanden.
Das klappt auch so auf den ersten Blick, wie ich mir das vorstelle. Nachdem ich aber die ersten Gehversuche damit gestartet habe, kam mir der Gedanke: "Wie lange bleiben eigentlich diese CLASS VAR erhalten? Bis das Programm beendet wird? Diese Klasse datenbank wird über LOCAL Instanzen aufgerufen, die ja dann am Ende einer Funktion eigentlich nicht mehr da sind. Wenn ich aber diese Funktion verlasse, in der die LOCAL Vars sind und sie wieder aufrufe und dann die LOCAL Vars neu instanziiere, sind die Werte immer noch da, sprich die INITCLASS wird auch nicht wieder aufgerufen. Ist das jetzt Zufall, oder habe ich nur nicht lange genug gewartet, bis sie vom GB zerstört werden? Oder sagt das System sich: "1x aufgerufen, das genügt für immer".?
Zuletzt geändert von Manfred am So, 09. Mai 2010 12:17, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: CLASS VAR SHARED in INITCLASS

Beitrag von Martin Altmann »

Moin Manfred,
die bleiben da, bis das Programm beendet wird (oder, genauer, bis die Klasse als solche aus dem Speicher geräumt wird)!
Die InitClass zieht ja nur, wenn die Klasse das erste Mal initialisiert wird - und das wird sie ja spätestens beim ersten Create bzw. beim ersten Vererben! Selbst wenn dann die so erzeugte Klasse destroyed würde, ist die Parentklasse ja trotzdem noch definiert/initialisiert - und somit auch die Klassenmethoden und Klassenvariablen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: CLASS VAR SHARED in INITCLASS

Beitrag von Manfred »

OK,

was heißt denn Dann aus dem Speicher geräumt wird? Das passiert aber dann nicht irgendwann automatisch, wenn es keine Instanzen davon mehr gibt? Weil es würde mir schon so in den Kram passen, wenn sie bis zum Programmende so bleiben würde. Das würde aber auch heißen, der Speicher würde ja nie wirklich "leer" werden.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CLASS VAR SHARED in INITCLASS

Beitrag von brandelh »

Hallo Manfred,

am Besten kannst du dir das mit einer STATIC Variablen vorstellen die außerhalb von Funktionen im Quellcode steht.
Diese wird zwar in Funktionen dieser PRG genutzt, aber gehört denen nicht. Keine Funktion kann diese daher "freigeben" oder als unnötig markieren.

Wenn du nun ein Objekt aus deiner Klasse generierst, dient die Klasse als Schablone, aber du hast keinen Zugriff auf die Klasse selbst sondern nur auf die Objekte dieser Klasse ...

Code: Alles auswählen

oObj := MyClass():new():create()
oObj:destroy() 
// zerstört nur dieses Objekt und die darin enthaltenen Referenzen auf das BS.
Eine CLASS VAR in diesem Objekt ist eine Referenz auf den Speicherbereich,
der in der Klasse selbst "STATIC" verwaltet wird.
Wenn du das Klassenobjekt selbst zerstören willst, falls das überhaupt geht, müsste man es so versuchen:

Code: Alles auswählen

oClass := MyClass()
oClass:destroy()
oder
oClass := NIL
ich vermute aber, dass :destroy() hier unbekannt ist und NIL nur den Zugang zum Speicher killt, aber
den Speicher nicht wirklich freigibt.

Vermutlich können nur dynamische Klassen "gekillt" werden.

Eine andere Frage ... macht es überhaupt SINN das zu tun ?

Eigentlich ist doch die CLASS VAR genau dafür da, während des Programmlaufs eine Variable für alle zu sein 8)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: CLASS VAR SHARED in INITCLASS

Beitrag von Manfred »

Hi Hubert,

ein destroy() klappt so nicht, da gibt es eine Fehlermeldung. Mir ging es auch nur darum, dass die Vars erhalten bleiben. Ich war mir nicht sicher und dachte mir, bevor ich jetzt meine Klasse umstelle, frage ich lieber nochmals nach. Für mich macht das schon richtigen Sinn, dass es so ist, wie es jetzt ist. Ich denke mal, es ergeben sich neue Möglichkeiten für mich. Muß ich jetzt aber erst mal testen, was da alles machbar wäre.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten