Delphi XE2中的命名空间

5
我有两个bpl包:Core和Business,被一个应用程序使用。 Core.bpl包含有TUser类的User.pas单元。在Core.bpl中的TUser仅具有两个基本字段:Login和Password。 我想要通过扩展Business包中的TUser类来添加新字段UserName。并且我想将业务单元命名为基本单元:User.pas。
因此,我在Business.bpl中创建了一个新的User.pas单元,并在其中放置了从Core.bpl中扩展的TUser类。 现在我需要区分Core.bpl中的TUser和Business.bpl中的TUser。我需要在这里使用"命名空间的力量" :)
我阅读了Embarcadero doc page。他们说可以通过命名来设置默认名称空间,例如Base.Core。 我将我的包命名为Base.Core.bpl和Extra.Business.bpl。编译后的文件也是如此命名。 但它们中的所有单元仍然按照它们之前的名称命名:User.pas -> User.dcu。
现在我有两个类TUser在模块User.pas中:一个在Base.Core.bpl包中,另一个在Extra.Business.bpl包中。 Extra中的User.pas看起来像这样:
unit User;
interface
uses
  Base.User;
type
  TUser = class(Base.User.TUser)
  end;

但是当我想要编译它时,弹出了一个窗口:"删除用户。在必需的包Base中找到单元User。"

我该怎么做才能像Java那样从Base.User.TUser继承新的TUser呢?

P.S. 以防万一,我使用的是Delphi XE2 IDE。


如果你想使用这样的符号,那么你不应该将它们命名为“Unit Base.User”和“Unit Business.User”吗? - Nickolay Olshevsky
核心和业务部分有许多单元...... 而且它们都在SVN中 :( 重命名所有这些单元是最后的方法...... 或许,有更简单的方法吗? - Mikhail Kopylov
1
我明白你的情况。文档上说一回事,但程序的行为完全不同。 - David Heffernan
如果可行的话,设置“默认命名空间”。在早期版本的项目选项中,它位于“目录/条件”中。但现在我不知道为什么找不到它了,但可以在“编译”的“其他选项”中添加它作为附加选项。 - Sertac Akyuz
在“编译”中的“其他选项”选项中,我应该传递什么? - Mikhail Kopylov
@omickron - 例如:--default-namespace="Base.Core" - Sertac Akyuz
1个回答

6

默认的命名空间似乎是Portal cake - 这是假的。您链接到的文档与程序不匹配。

我创建了这个程序:

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

我认为您必须在单元名称中明确指定命名空间。


你将不得不在单位名称中明确指定命名空间。真遗憾... - Mikhail Kopylov
我真的无法理解为什么程序与文档不匹配。文档非常清晰,很难看出我们可能会误解它。 - David Heffernan
这在XE3中也会发生,你不知道吗? - Mikhail Kopylov
看起来像是一个 bug。可能在 Delphi 中,也可能在文档中... 不过还是谢谢。 - Mikhail Kopylov
只是澄清一下,在Delphi 2009-XE中,设置项目选项中的默认命名空间将导致它被添加到任何生成的dcus之前。如果默认命名空间为MyCompany.Programs.MyProgram,并且单元文件命名为MyUnit.pas,则生成的dcu将为MyCompany.Programs.MyProgram.MyUnit.dcu。而且,如果该单元明确命名为MyCompany.Programs.MyProgram.MyUnit.pas,则设置默认命名空间允许其他单元简单地引用它为MyUnit。这个设置在XE2中被删除了,但正如Sertac在问题评论中指出的那样,命令行设置仍然存在。 - Kenneth Cochran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接