programacion - Delphi XE: el constructor de clases no se llama en una clase usando genéricos
visibilidad en java definicion (2)
Parece un error de compilación. El mismo código funciona si mueve la declaración e implementación de TTestClass a una unidad separada.
unit TestClass;
interface
type
TTestClass<T> = class
private
class constructor CreateClass();
public
constructor Create();
end;
var
test: TTestClass<Integer>;
implementation
class constructor TTestClass<T>.CreateClass();
begin
Writeln(''class created'');
end;
constructor TTestClass<T>.Create();
begin
Writeln(''instance created'');
end;
end.
Considere el siguiente ejemplo (estoy usando Delphi XE):
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.
La construcción de clase nunca se llama y, por lo tanto, la línea ''clase creada'' no se imprime. Sin embargo, si TTestClass<T>
la generalización y hago TTestClass<T>
en una clase estándar TTestClass
, todo funciona como se espera.
¿Me estoy perdiendo algo con los genéricos? O simplemente no funciona?
¡Cualquier idea sobre esto sería aprehendida!
Gracias, -Stefan--
Puedo confirmar que esto es un error. Si la única instanciación de la clase está en el archivo .dpr, entonces el constructor de la clase no se ejecuta. Si crea otra unidad, es decir, un archivo .pas separado, y TTestClass<Integer>
una instancia de TTestClass<Integer>
desde allí, se ejecutará el constructor de su clase.
He enviado QC # 103798 .