Как сделать в проекте так, чтобы несколько классов были описаны в различных файлах проекта, но принадлежали одному пространству имён? (В VS это достаточно удобно - легче искать классы.)
Никак. Здесь - другая идеология. Надо понимать, что в Object Pascal нет проектов - есть главный файл и подключаемые к нему модули (каждый - в своём файле и каждый определяет своё пространство имён)
Конечно @Admin прав, надо стараться делать всё из 1 пространства имён в 1 файле, но в особых случаях можно сделать так:
t1Unit.pas:
unit t1Unit;
type
t1=class end;
end.
t2Unit.pas:
unit t2Unit;
type
t2=class end;
end.
MyNameSpace.pas:
namespace MyNameSpace;
uses t1Unit;
uses t2Unit;
type
t1=t1Unit.t1;
t2=t2Unit.t2;
end.
К главной программе подключаем только MyNameSpace
, но не юниты, тогда они будут в разных файлах и в 1 пространстве имён. Я не буду утверждать что этот код рабочий, потому что я это написал в браузере и не пробовал компилировать, но вроде всё разрешено. И ещё, делать по модулю на каждый класс и правда плохо. Если идти против идеологии - легко натолкнуться на спорную ситуацию, где вам удобнее 1 способом, но разработчикам это будет совсем не к стати… Зато если разделять по тематике, как то так:
Subjects1.pas:
unit Subjects1;
type
t1=class end;
t1enum=(Square,Circle);
end.
Subjects2.pas:
unit Subjects2;
type
t2=class end;
t2enum=(Red,Green,Blue);
end.
MyNameSpace.pas:
namespace MyNameSpace;
uses Subjects1;
uses Subjects2;
type
{$region Subjects1}
t1=Subjects1.t1;
t1enum=Subjects1.t1enum;
{$endregion Subjects1}
{$region Subjects2}
t2=Subjects2.t2;
t2enum=Subjects2.t2enum;
{$endregion Subjects2}
end.
- то это вполне оправдано. Кстати это даёт дополнительные возможности инкапсуляции, ведь вы можете объявить что то в модуле, но не объявлять его копию в пространстве имён. И про регионы не забывайте, читабельность лишней не бывает .
Создавайте проект, добавляйте пространство имен. Пространства имен в паскале сквозные.