2011-05-15 7 views
11

Estoy leyendo RAD Studio Documentation en Delphi XE. aquí algunos textos.delphi XE multi-unit namespace question

[Delphi Referencia -> Guía de Lenguaje Delphi -> Programas y Unidades -> Usar espacios de nombres -> Búsqueda de espacios de nombres -> Espacios de nombres Multi-unit]

Espacios de nombres Multi-unit

múltiples unidades puede pertenecer al mismo espacio de nombres, si las declaraciones de la unidad se refieren al mismo espacio de nombres. Por ejemplo, uno puede crear dos archivos, unit1.pas y unit2.pas, con las siguientes declaraciones de unidad:

// in file 'unit1.pas' 
unit MyCompany.ProjectX.ProgramY.Unit1 

// in file 'unit2.pas' 
unit MyCompany.ProjectX.ProgramY.Unit2 

En este ejemplo, el espacio de nombres contiene MyCompany.ProjectX.ProgramY lógicamente todos los símbolos de interfaz de unit1.pas y unit2.pas.

Los nombres de símbolo en un espacio de nombre deben ser únicos en todas las unidades del espacio de nombre.
En el ejemplo anterior, es un error para Unit1 y Tema 2. tanto a definir un símbolo de interfaz global llamada MySymbol

Probé esto. código a continuación.

----------------------------------------------------------------- 
program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Lib.A in 'Lib.A.pas', 
    Lib.B in 'Lib.B.pas'; 

begin 
    WriteLn (TestValue) ; 
    ReadLn ; 
end. 
----------------------------------------------------------------- 
unit Lib.A; 

interface 
    const TestValue : Integer = 10 ; 
implementation 

end. 
----------------------------------------------------------------- 
unit Lib.B; 

interface 
    const TestValue : Integer = 10 ; 
implementation 

end. 

Esto no es un error. ¿Por qué? No entiendo.

+0

¿Qué ocurre si * solo * 'usa SysUtils, Lib' en' Project1' y 'TestValue: Integer = 20' en' Lib.B' y luego '' WriteLn (TestValue) 'en' Project1'? –

+0

Supongo que Codegear tenía algunos planes irregulares para extender el concepto .Net de espacios de nombres en Delphi para Win32 que nunca se han implementado. Donde no hay espacios de nombres de unidades múltiples en Delphi, y es difícil decir de qué se trata la documentación anterior. – kludg

Respuesta

4

Su código no coincide con la documentación. La documentación establece explícitamente que el nombre de archivo de 'unit MyCompany.ProjectX.ProgramY.Unit1' es unit1.pas, not MyCompany.ProjectX.ProgramY.Unit1.

No creo, sin embargo, que esta característica se haya implementado. Si cambio de su código para almacenar primera unidad en a.pas de archivos y la segunda unidad en b.pas de archivos, unidades no compilan en absoluto y el error es

[DCC Error] A.pas(1): E1038 Unit identifier 'Lib.A' does not match file name 

(¿Qué es exactamente lo que yo esperaba ver.)

En su caso no hay conflicto porque siempre puede usar un nombre completo de 'conflictivo' global: Lib.A.TestValue y Lib.B.TestValue.

+0

También recibí el mismo error, pero estoy usando Delphi 2009. Quizás esto sea nuevo para XE (o 2010). –

+0

He probado en XE. – gabr

+1

Solo verificando: ¿está usando Delphi * XE *? Preguntar porque, por lo general, la documentación va a la zaga de las características y no al revés. De su respuesta a Andreas, veo que lo hizo.Interesante. –

0

En Delphi.NET (antes del Prisma): nombre de la unidad = espacio de nombres. Esa es la forma en que lo usaron en ese momento, y en dotNET una unidad era realmente un espacio de nombres (inclusive aparece como tal en IL generado).

En Delphi nativo, no veo la diferencia (si es que existe).

Cuestiones relacionadas