Модули vs namespace's

Понял. Этого я и боялся. Возможно ли устранить этот недостаток? А второй вопрос такой: Вы можете привести пример когда такие пространства имён могут быть полезны и когда без них никак не обойтись?

Я приведу. Допустим, есть две цветовые системы, RGB и LAB. У каждой системы есть класс Bitmap, Color и Graphics. Поместить эти классы для каждой цветовой системы в одно место нельзя, так как их имена совпадают, но разнести на абсолютно разные модули/библиотеки тоже нельзя. Решение - своё пространство имён для каждой системы.

2 лайка

Приведу пример, как можно объединить разные модули.

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;
1 лайк

Правильно подозреваете. Модули не для этого предназначены.

Вы пропустили важное условие. Не просто ставить точку, а указывать полный путь к текущему неймспейсу. Иначе - оно окажется непосредственно в библиотеке, что не правильно. Ставить рандомные точки нельзя нигде.

Можете привести пример указания полного пути к namespace’у. Вы хотите сказать, что я могу в различных папках размещать пространства имён и с помощью полного пути делать, например, одно пространство имён потомком другого?

Не путайте файлы с неймспейсами! Если у Вас библиотека с именем BaseName, то её корневой неймспейс - тоже BaseName, и имя файла. Если в библиотеку Вы добавляете неймспейс, то его нужно поместить в корневой неймспейс библиотеки, т. е. BaseName. Делается это через точку. Файлы могут быть где угодно, полный путь к ним никак не отразится.

1 лайк

Вас понял.

Новый термин детектед. Наследование неймспейсов :smile:

Еще можно новые термины - внук, родитель. :slight_smile:

Тут уже как то деда вспоминали, при наследовании классов.

Вообще, это какая-то бешеная котовасия возникает из-за введения данных пространств имён таким способом.

У нас в разделе uses можно подключать модули и ПРОСТРАНСТВА ИМЕН NET:

uses GraphWPF, System.IO;

А эти доморощенные пространства имен непонятно для чего появившиеся надо подключать как-то по-особому. Причем, судя по форме их описания они пространствами имен таки не являются, а являются модулями или библиотеками особой гибридной структуры.

1 лайк

Отчасти согласен. Вы, кстати, так и не ответили на мой вопрос - почему есть запрет на разнесение пространства имён по нескольким файлам?

Это реализовывал ibond. Не знаю. Кстати реализовывал с чьей-то подачи на форуме. Хотел бы я знать, с чьей…

Понял. Дождёмся его ответа.

С моей.