delphixe2中的名称空间

delphixe2中的名称空间,delphi,namespaces,delphi-xe2,Delphi,Namespaces,Delphi Xe2,我有两个bpl包:Core和Business,由一个应用程序使用。 Core.bpl包含unit User.pas,其中包含TUser类。Core.bpl中的TUser只有两个基本字段:Login和Password。 我想在businesspackage中用新字段:UserName扩展TUser类。我想将业务单元命名为基本单元:User.pas 因此,我在Business.bpl中创建了一个新的unit User.pas,并将其放置在TUser类中,该类从Core.bpl扩展了TUser。 现在

我有两个bpl包:Core和Business,由一个应用程序使用。 Core.bpl包含unit User.pas,其中包含TUser类。Core.bpl中的TUser只有两个基本字段:Login和Password。 我想在businesspackage中用新字段:UserName扩展TUser类。我想将业务单元命名为基本单元:User.pas

因此,我在Business.bpl中创建了一个新的unit User.pas,并将其放置在TUser类中,该类从Core.bpl扩展了TUser。 现在,我需要将TUser与Core.bpl分开,将TUser与Business.bpl分开。我需要在这里使用“名称空间的力量”:

我读过。他们说可以通过命名包来设置包的默认名称空间,例如Base.Core。 我将我的包命名为Base.Core.bpl和Extra.Business.bpl。编译后的文件命名为so。 但其中所有单元的名称仍与以前相同:User.pas->User.dcu

现在我有两个类TUser在modules User.pas中:一个在package Base.Core.bpl中,另一个在package Extra.Business.bpl中。 “额外”中的User.pas看起来像

unit User;
interface
uses
  Base.User;
type
  TUser = class(Base.User.TUser)
  end;
但当我想编译它时,我有一个窗口:“删除用户。在所需的包库中找到了一个或多个用户。”

例如,要像在Java中一样从Base.User.TUser继承新的TUser,我该怎么做


为了以防万一,我使用Delphi XE2 IDE。

默认名称空间似乎是门户蛋糕——这是个谎言。您链接到的文档与程序不匹配

我制作了这个节目:

MyCompany.Programs.MyProgram.dpr

program MyCompany.Programs.MyProgram;

uses
  MyUnit in 'MyUnit.pas';

begin
end.
MyUnit.pas

unit MyUnit;

interface

implementation

end.
生成的.dcu文件名为
MyUnit.dcu
。根据您链接到的文档,它应该命名为
MyCompany.Programs.MyUnit.dcu


我相信您必须在单元名称中明确指定名称空间。

如果您想使用这种表示法,您不应该将它们命名为“unit Base.User”和“unit Business.User”吗?核心和业务中有许多单元。。。所有这些都在SVN中:(重命名所有名称是最后一种方法…可能是,你能做得更简单吗?我同意你的观点。文档说明了一件事。但是程序的行为完全不同。如果可行,请设置“默认名称空间”。它在“目录/条件”中在早期版本的项目选项中。不知何故,我现在找不到它,但可以在“编译”中的“其他选项”中将其作为附加选项添加。我应该向“编译”中的“其他选项”传递什么?您必须在单元名中显式指定命名空间这很遗憾…就我的一生而言,我不明白为什么程序与文档不匹配。文档非常清楚。很难看出我们怎么会误解它。这也发生在XE3中,你不知道吗?看起来像一个bug。可能在Delphi中,可能在文档中…但是谢谢。只是澄清一下,在Delphi 2009-XE设置中项目选项中的默认名称空间导致它被添加到任何生成的dcu之前。如果默认名称空间是
MyCompany.Programs.MyProgram
,并且单元文件名为
MyUnit.pas
,则生成的dcu是
MyCompany.Programs.MyProgram.MyUnit.dcu
。如果单元显式命名为
mycopany.Programs.MyProgram.MyUnit.pas
设置默认名称空间允许其他单位将其简称为
MyUnit
。此设置已在XE2中删除,但正如Sertac在问题注释中指出的,命令行设置仍然存在。