2011-10-26 9 views
9

¿podría alguien explicarme ¿cuál es el motivo que al crear una clase genérica debo mover mis constantes privados a la sección de interfaz? Esto está matando mi diseño, no quiero que otros vean algo que debería ser privado.E2506 Método de tipo parametrizado declarado en la sección de interfaz no debe utilizar el símbolo local

unit Unit38; 

interface 

uses 
    Generics.Collections; 

type 
    TSimpleClass<T> = class(TObject) 
    private 
    procedure DoSomethingInternal(const SomeString: string); 
    public 
    procedure DoSomething; 
    end; 

implementation 

const 
    MyString = 'some string'; //Why this must be public? 

{ TSimpleClass<T> } 

procedure TSimpleClass<T>.DoSomething; 
begin 
    DoSomethingInternal(MyString); //Compiler error 
end; 

procedure TSimpleClass<T>.DoSomethingInternal(const SomeString: string); 
begin 
    //------- 
end; 

end. 

Gracias.

Respuesta

5

Mismo error en D2010, por lo que las soluciones genéricas de D2010 no solucionan esto. Es un error: http://qc.embarcadero.com/wc/qcmain.aspx?d=79747

Fijo en la compilación 15.0.3863.33207. Cuál pienso es XE

Otro control de calidad en esto es: http://qc.embarcadero.com/wc/qcmain.aspx?d=78022 que implica un enum y todavía está abierto.

La documentación sobre el error no está muy clara por cierto. Ver: (!)

E2506 Method of parameterized type declared in interface section must not use local symbol '%s'

Se trata de una var clase en una clase genérica que no se puede asignar un valor literal en el constructor de la clase, siendo el punto de referencia para el constructor parameretrize ... Ni idea de por qué, pero supongo que tiene que ver con una limitación del compilador.

+0

Gracias Marjan. – Wodzu

+0

Tenga en cuenta que [QualityCentral ahora se ha cerrado] (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward), por lo que ya no puede acceder a los enlaces 'qc.embarcadero.com' . Si necesita acceder a datos antiguos de control de calidad, consulte [QCScraper] (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/). –

3

Es una consecuencia de la implementación de genéricos en Delphi. Cuando instancia una clase suministrando una T concreta en otra unidad, el código para la clase concreta se escribe en esa otra unidad. Pero esa otra unidad ya no puede ver su cadena privada constante. Es bastante frustrante.

Mi comprensión de la implementación de genéricos sugiere que la solución de Mikael resolverá el problema porque la clase const será visible cuando instancias tu tipo concreto en otra unidad.

2

No es una respuesta, pero una posible solución podría ser utilizar const privado en la declaración de clase.

TSimpleClass<T> = class(TObject) 
private 
    procedure DoSomethingInternal(const SomeString: string); 
    const MyString = 'some string'; //Why this must be public? 
public 
    procedure DoSomething; 
end; 

Esto funciona en Delphi 2010, XE y XE2, no en Delphi 2009.

+0

Gracias, +1 por una solución. – Wodzu

Cuestiones relacionadas