2012-06-18 19 views
6

Agregué una clase de variables a la clase base de una jerarquía de clases profundas. Es un número entero destinado a contar el número de instancias creadas por tipo de clase. Pero me he encontrado con un problema.Variable de la clase Delphi por clase

dado el ejemplo:

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; 

que supone que puedo usar la clase var para almacenar el número de instancias creadas por clase , pero esto no parece ser el caso.

Inspección TBaseClass.fCreated retornos mismo valor que TDescendant.fCreated, el cambio de una a través de inspector cambia la otra, por lo que se comporta como si fCreated es una sola var global.

Esperaba que fCreated se mantuviera por tipo de clase, ¿no es ese el punto? Qué me estoy perdiendo ?

Respuesta

8

Te estás perdiendo todo. Su análisis de cómo funcionan las variables de clase es correcto. Una clase var no es más que una variable global que tiene el alcance de la clase.

Una solución simple para usted es utilizar un diccionario para contar las instancias. Un enfoque más hacky es utilizar un truco mío del que Hallvard Vassbotn escribió en su blog, que (ab) utiliza el VMT para almacenar campos específicos de clase. Puede leerlo al respecto here.

+0

El mismo comentario ya fue dado aquí: http://stackoverflow.com/a/72496/12170 – PatrickvL

+0

Hacky pero hace lo que yo quería –

Cuestiones relacionadas