Considere el siguiente ejemplo (estoy usando Delphi XE):Delphi XE: constructor de la clase no se consiga llamar en una clase utilizando los genéricos
program Test;
{$APPTYPE CONSOLE}
type
TTestClass<T> = class
private
class constructor CreateClass();
public
constructor Create();
end;
class constructor TTestClass<T>.CreateClass();
begin
// class constructor is not called. this line never gets executed!
Writeln('class created');
end;
constructor TTestClass<T>.Create();
begin
// this line, of course, is printed
Writeln('instance created');
end;
var
test: TTestClass<Integer>;
begin
test := TTestClass<Integer>.Create();
test.Free();
end.
El constructur clase nunca es llamado y 'clase de ahí la línea creada 'no está impreso. Sin embargo, si elimino la generalización y hago TTestClass<T>
en una clase estándar TTestClass
, todo funciona como se esperaba.
¿Me estoy perdiendo algo con genéricos? O simplemente no funciona?
¡Cualquier idea sobre esto sería aprehendida!
Gracias, --Stefan--
La [documentación] (http://docwiki.embarcadero.com/RADStudio/es/Methods#Class_Constructors) establece: "Nota: El constructor de clase para una clase o registro genérico puede ejecutarse varias veces. La cantidad exacta de veces el constructor de clase se ejecuta en este caso depende del número de versiones especializadas del tipo genérico. Por ejemplo, el constructor de clase para una clase especializada TList puede ejecutarse varias veces en la misma aplicación. " Pero se parece un poco a un error entonces. –
Sí. Yo también leo eso. A menos que "varias veces" incluya cero veces, esto realmente parece un error. – Schafsmann
Regla general: no intente hacer una aplicación .dpr independiente. Siempre tenga al menos una unidad y mantenga todo fuera de los archivos DPR que puede mantener fuera de él. –