Понял. Этого я и боялся. Возможно ли устранить этот недостаток? А второй вопрос такой: Вы можете привести пример когда такие пространства имён могут быть полезны и когда без них никак не обойтись?
Я приведу. Допустим, есть две цветовые системы, RGB и LAB. У каждой системы есть класс Bitmap, Color и Graphics. Поместить эти классы для каждой цветовой системы в одно место нельзя, так как их имена совпадают, но разнести на абсолютно разные модули/библиотеки тоже нельзя. Решение - своё пространство имён для каждой системы.
Приведу пример, как можно объединить разные модули.
FirstClassUnit:
unit FirstClassUnit;
interface
uses GeneralClassUnit;
type
TFirstClass = class(TGeneralClass)
public
function ToString(): string; override;
end;
implementation
function TFirstClass.ToString() := 'TFirstClass';
end.
SecondClassUnit:
unit SecondClassUnit;
interface
uses GeneralClassUnit;
type
TSecondClass = class(TGeneralClass)
public
function ToString(): string; override;
end;
implementation
function TSecondClass.ToString() := 'TSecondClass';
end.
GeneralClassUnit:
unit GeneralClassUnit;
interface
type
TGeneralClass = class
procedure Show();
end;
implementation
procedure TGeneralClass.Show() := Writeln(ToString());
end.
MyTypes:
unit MyTypes;
uses FirstClassUnit;
uses SecondClassUnit;
uses GeneralClassUnit;
type
TFirstClassAlias = FirstClassUnit.TFirstClass;
TSecondClassAlias = SecondClassUnit.TSecondClass;
TGeneralClassAlias = GeneralClassUnit.TGeneralClass;
end.
Main:
uses MyTypes;
begin
var (x, y) := (new TFirstClassAlias(), new TSecondClassAlias());
x.Show();
y.Show();
end.
Но вопрос здесь в том, а принято ли так использовать модули? Подозреваю, что нет.
Насколько понял, Вы имеете ввиду, что в у двух систем есть несколько одноименных файлов и использовать в программе их не получится - будет конфликт имён. В данном случае я бы сделал так: в базовое пространство имён поместил бы общие классы, а в пространства имён (потомки базового) я бы поместил такие классы как RGB и LAB. Собственно, Вы это выше и озвучили.
Пространство имён в одном файле может быть только одно?
Да. Весь файл объявляется как пространство имён, как модуль или библиотека.
На практике пространства имён функционируют почти также как и модули:
namespace NS;
interface
uses GraphABC;
procedure Draw();
implementation
procedure Draw() := ClearWindow(clRed);
initialization
Draw();
finalization
TextOut(1, 1, 'Bye');
end.
Из этого я сделал вывод. Если не прав, поправьте. Только вместо unit ключевое слово namespace, и подключаются они по-другому. Также можно в именах ставить точку:
namespace BaseNamespace.XNamespace;
Правильно подозреваете. Модули не для этого предназначены.
Вы пропустили важное условие. Не просто ставить точку, а указывать полный путь к текущему неймспейсу. Иначе - оно окажется непосредственно в библиотеке, что не правильно. Ставить рандомные точки нельзя нигде.
Можете привести пример указания полного пути к namespace’у. Вы хотите сказать, что я могу в различных папках размещать пространства имён и с помощью полного пути делать, например, одно пространство имён потомком другого?
Не путайте файлы с неймспейсами! Если у Вас библиотека с именем BaseName, то её корневой неймспейс - тоже BaseName, и имя файла. Если в библиотеку Вы добавляете неймспейс, то его нужно поместить в корневой неймспейс библиотеки, т. е. BaseName. Делается это через точку. Файлы могут быть где угодно, полный путь к ним никак не отразится.
Вас понял.
Новый термин детектед. Наследование неймспейсов
Еще можно новые термины - внук, родитель.
Тут уже как то деда вспоминали, при наследовании классов.
Вообще, это какая-то бешеная котовасия возникает из-за введения данных пространств имён таким способом.
У нас в разделе uses можно подключать модули и ПРОСТРАНСТВА ИМЕН NET:
uses GraphWPF, System.IO;
А эти доморощенные пространства имен непонятно для чего появившиеся надо подключать как-то по-особому. Причем, судя по форме их описания они пространствами имен таки не являются, а являются модулями или библиотеками особой гибридной структуры.
Отчасти согласен. Вы, кстати, так и не ответили на мой вопрос - почему есть запрет на разнесение пространства имён по нескольким файлам?
Это реализовывал ibond. Не знаю. Кстати реализовывал с чьей-то подачи на форуме. Хотел бы я знать, с чьей…
Понял. Дождёмся его ответа.
С моей.