2011-09-15 79 views
1

我明白,命名空间是单位的容器;但我对它的工作理解不够。 我试图解释更好,关于我想告诉。例如我有四个单位:命名空间和单位

1) Animals    // es: class TAnimals 
2) Animals.Dog   // es: class TDog 
3) Animals.Cat   // es: class TCat 
4) Animals.Cat.Female // es: class TFemale 

当然,这四个单位是在四个不同的文件。 如果我作出新的单元,并需要使用所有的话,我写:

uses 
    Animals, Animals.Dog, Animals.Cat, Animals.Cat.Female 

现在,直到有极少数的问题不有,但都非常的时候?所以我想知道,我可以更好地管理,使一个只有单位:动物(命名空间根)包含所有其他的,有这样的东西为:

uses 
    Animals; 

而且有从动物中定义的所有其他类的访问第二,第三等层面的所有其他命名空间,例如:

program Project1; 
uses 
    Animals; 
var 
    x: Animals; 
begin 
    x := TAnimals.Cat.Female.Create; 
    try 
    .... 
    finally 
    x.Free; 
    end; 
end. 

在互联网搜索,也许我已经找到了使用界面,但我有印象,在我看来becouse不是正确的解决方案是非常复杂的东西,与delphi xe2是原生的。很可能我错了,或者它指的是一些旧版本的delphi;我真的不知道。 但我想知道,因为我这样做,当然如果可能的话。 非常感谢。

+0

我不想这样做,因为它意味着在搜索路径中找到的每个单元都以“动物”开头。即使它从未使用过,也会默默地包含在内。不,我绝对不喜欢那样! –

回答

2

基本上XE2只是将RTL单元重命名为带点的名称,并尝试在命令行上加载具有点缀前缀的单元。

很长一段时间以来,德尔福已经存在具有点的单元的能力。

忘记你对命名空间的所知,Delphi XE2不是那样的。在命名空间层级中移动单元意味着重命名它(改变前缀),与例如容器/文件/类具有特定名称的Java,只有其位置表示在命名空间层次结构中的位置。

+1

最后一句话是错误的,因为此外,Java类文件(坐在正确的目录中)还必须在第一个代码行(package com.example; ... public class Bzz ...)中指定它的包名称 - 所以如果你有这个文件,你也知道它在哪个目录中。 – mjn

+0

啊,我认为这不是强制性的。 –

+0

也可以在项目选项对话框中指定默认命名空间(在XE2中称为单元空间名称) - 不仅在命令行 – mjn