Delphi XE многопользовательский вопрос пространства имен
Я читаю RAD Studio Documentaion в Delphi XE.
вот несколько текстов.
[Справочник по Delphi → Руководство по языку Delphi → Программы и юниты → Использование пространств имен → Поиск пространств имен → Многомерные пространства имен]
Многопользовательские пространства имен
Несколько единиц могут принадлежать к одному и тому же пространству имен, если объявления единиц относятся к одному и тому же пространству имен. Например, можно создать два файла: unit1.pas и unit2.pas со следующими объявлениями блока:
// in file 'unit1.pas'
unit MyCompany.ProjectX.ProgramY.Unit1
// in file 'unit2.pas'
unit MyCompany.ProjectX.ProgramY.Unit2
В этом примере пространство имен MyCompany.ProjectX.ProgramY логически содержит все символы интерфейса из unit1.pas и unit2.pas.
Имена символов в пространстве имен должны быть уникальными для всех единиц пространства имен.
В приведенном выше примере ошибка для Unit1 и Unit2 заключается в определении глобального символа интерфейса с именем mySymbol
Я протестировал это.
кода ниже.
-----------------------------------------------------------------
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.
Это не ошибка. Зачем? Я не понимаю.
Ответы
Ответ 1
Ваш код не соответствует документации. В документации явно указано, что имя файла "unit MyCompany.ProjectX.ProgramY.Unit1" - unit1.pas, а не MyCompany.ProjectX.ProgramY.Unit1.
Однако я не верю, что эта функция реализована вообще. Если я изменю свой код для хранения первого блока в файле a.pas и второго блока в файле b.pas, блоки вообще не компилируются, а ошибка
[DCC Error] A.pas(1): E1038 Unit identifier 'Lib.A' does not match file name
(Это точно так, как я ожидал увидеть.)
В вашем случае нет конфликта, потому что вы всегда можете использовать полное имя "конфликтующее" глобальное - Lib.A.TestValue и Lib.B.TestValue.
Ответ 2
В Delphi.NET(до Prism): unit name = namespace. То, как они использовали это в то время - и в dotNET единица была действительно пространством имен (включительно как таковое в сгенерированном ИЛ).
В родном Delphi я не вижу разницы (если это вообще существует).