Bien, entonces tengo una clase base a la que llamaremos TFruit
. De esto hay varios descendientes como TApple
, TOrange
y así sucesivamente. Necesito guardar las propiedades de las clases descendientes en un archivo.Necesidad de asociar un valor entero único con las clases
Para poder crear la clase correcta al cargar los datos, cada clase necesita tener un ID
que escriba en el archivo antes de escribir los datos reales. Actualmente, se me ha ocurrido con la siguiente forma de hacerlo:
type
TFruit = class
const ID = 0;
end;
TApple = class(TFruit)
const ID = 1;
end;
TOrange = class(TFruit)
const ID = 2;
end;
Prueba esto, descubrí que tengo que ser super cuidado qué clase declaro. Si uso esto:
var Fruit: TFruit;
Fruit := TOrange.Create;
... entonces Fruit.ID
volverá cero. Sin embargo, declarando Fruit
como TOrange
producirá el resultado esperado Fruit.ID = 2
(Alguien sabe por qué?)
Así que, básicamente, estoy haciendo esto correcto o hay una mejor manera de hacerlo? Tener que crear una función de clase y devolver un valor desde allí parece muy feo en comparación (declaración de función adicional, implementación y código).
Para mayor comodidad, se podría agregar un método de clase a la clase base de objetos registrados que devuelven el ID de esa clase. Y dado que los métodos de clase (a diferencia de los métodos estáticos de estilo C#) reciben el tipo de clase como parámetro 'self', esto funciona como se esperaba. – CodesInChaos
@CodeInChaos, cierto, pero eso requeriría que cada clase "supiera" su identificación que se puede evitar y podría convertirse en un dolor crear nuevos descendientes para tratar de averiguar cuál es la próxima identificación disponible. –
No, quiero decir que este método llama a su función 'FindID' con' self' como param. Pero podría ser mejor desde el punto de vista arquitectónico si las propias clases no conocen los ID, ya que pueden considerarse un detalle de implementación del serializador. – CodesInChaos