2012-06-18 49 views
6

Ich habe eine Klassenvariable zur Basisklasse einer tiefen Klassenhierarchie hinzugefügt. Es ist eine ganze Zahl, die die Anzahl der pro Klassenart erstellten Instanzen zählt. Aber ich bin auf ein Problem gestoßen.Delphi Klassenvariable pro Klasse

das Beispiel Gegeben:

TBaseClass = class 
    private 
    class var fCreated: integer; 
    public 
    class function NewInstance: TObject; override; 
    end; 

    TDescendant = class(TBaseClass) 
    end; 

    ... 

    class function TBaseClass.NewInstance: TObject; 
    begin 
    result := inherited NewInstance; 
    inc(fCreated); 
    end; 

ich davon aus, dass ich die Klasse var die Anzahl der Instanzen pro Klasse erstellt speichern kann, aber dies scheint nicht der Fall zu sein.

Inspizieren TBaseClass.fCreated kehrt gleichen Wert wie TDescendant.fCreated, ändert man über Inspektor ändert die andere, so dass er sich so verhält, als ob fCreated ist eine einzige globale var.

Ich erwartete fCreated pro Klassenart beibehalten werden, ist das nicht der Punkt? Was vermisse ich ?

Antwort

8

Ihnen fehlt nichts. Ihre Analyse der Funktionsweise von Klassenvariablen ist korrekt. Eine Klassenvariable ist nichts anderes als eine globale Variable, die von der Klasse definiert wird.

Eine einfache Lösung für Sie ist, ein Wörterbuch zu verwenden, um die Instanzen zu zählen. Ein hackigerer Ansatz ist es, einen Trick von mir zu verwenden, über den Hallvard Vassbotn gebloggt hat, der (ab) den VMT verwendet, um klassenspezifische Felder zu speichern. Sie können alles darüber lesen here.

+0

Der gleiche Kommentar wurde bereits hier gegeben: http://StackOverflow.com/A/72496/12170 – PatrickvL

+0

Hacky aber tut, was ich wollte –

Verwandte Themen