7.4 Namespaces

7.4.1 概要

Namespace(命名空间)是一个可以包含一组通过name来鉴别的NamedElements的Element。Packages(参见12章)是命名空间,它的特定目的就是把所包含的其它NamedElements组织到一个模型。还有其它许多种类的命名空间元素,包括Classifiers(参见9.2,它包含有名称的Features和内嵌的Classifiers)和BehavioralFeatures(参见9.4,它包含命名的参数)。

7.4.2 抽象语法

图7.5 Namespaces

7.4.3 语义

命名空间

命名空间为NamedElements提供了一个容器,这些元素称为命名空间的ownedMembers。命名空间还可以从其它命名空间引入(import)NamedElements,与ownedMembers一起,它们称为引入(importing)命名空间的members。如果名为N的命名空间的一个member名为x,那么该member可以通过限定名N::x的形式来访问。

没有使用命名空间的名字进行限定的简单名称称为非限定名。在一个命名空间中,非限定名可以用来指示该命名空间内部的成员和外部没有被隐藏的名字。外部的名字是在直接包含NamedElement的命名空间中使用该NamedElement的非限定名来访问它的名字。如果一个外部名称不能与内部命名空间的所有成员区分开的话,那么该外部名称被隐藏。(在“Named Elements”部分讨论可区分性。)

由于命名空间也是一个NamedElement,因此一个NamedElement的全限定名可能包含多个命名空间的名字,例如N1::N2::x

命名空间的ownedRule约束代表了所限制元素的良构规则(参见7.6关于Constraints)。这些约束在需要的时候判定受限元素是否是良构的。

Named Elements

NamedElement是模型中具有name的元素。该名称在元素是可访问的情况下可以用于在命名空间中鉴别NamedElement。

注意. NamedElement的name是可选的(optional),这为名称的缺失(这与空(empty)名称不同)提供了可能。

NamedElements按照与其它元素相区分的规则出现在命名空间中。两个成员是可区分的缺省规则是它们具有不同的名称,或者如果它们有相同的名称,那么它们的元类(metaclasses)不同并且它们之间没有直接或间接的继承关系。这个规则对于特定的情况可以被重载,例如Operations通过它们的签名来区分(参见9.6)。

NamedElement的可见性提供了使用上的约束。

NamedElement除了有一个显式的名称外,还可以关联一个用于计算该NamedElement的名称的字符串表达式。在模板中(参见7.3),NamedElement可以有一个字符串表达式,该表达式的子表达式被模板参数(TemplateParameters)暴露为参数化的元素(ParameteredElements)。当模板被绑定时,暴露的子表达式被实际的模板参数所替换。从而得出整个字符串表达式的值,用于NamedElement的名称。

NamedElement可以既有一个名称,又有一个nameExpression。此种情况下,name可以用作NamedElement的别名,举个例子,可以用于在一个约束表达式中引用该元素。(这避免了在文本式字面表达方式中使用字符串表达式所带来的累赘,尽管这是允许的。)

Packageable Elements and Imports

PackageableElement(可打包元素)是可以被一个Package(包,参见第12章)所直接拥有的NamedElement。任何这样的元素都可以用作一个模板参数(参见模板7.3)。

ElementImpot是引入命名空间和一个可打包元素之间的DirectedRelationship(有向关系)。它向引入命名空间增加了该可打包元素的名称。ElementImport的可见性与被引入的元素相同或更加受限。

在与一个外部名称冲突的情况下(在一个包含命名空间中定义的元素可以在其中使用非限定名来使用),在引入空间中被引入的元素可以使用非限定名来访问,尔外部的名称被ElementImport所隐藏。外部的名称可以使用限定名来访问。

PackageImport是引入命名空间和一个包之间的有向关系,表明引入命名空间把包中成员的名字都添加到自己的命名空间中。从概念上,包引入与每一个元素都ElementImport是相同的,除非有一个单独定义的ElementImport。如果某个元素是ElementImport,那么它比通过PackageImport引入的相同的元素具有优先性(即如果该元素是ElementImport的,而非PackageImport所引入的)。

如果ElementImports或PackageImports导致在命名空间中出现不可区分的元素,那么这些元素不会到添加到引入命名空间中,在引入命名空间中使用使用它们得用限定名。

通过公开的引入的元素在引入命名空间空间中是公开的成员。这意味着,如果如果命名空间是一个包,那么就可以导致进一步的引入。

注意. 命名空间不能引入自身,也不能引入它自己的ownedMembers。这意味着在所属命名空间中不能获取一个NamedElement的别名。

results matching ""

    No results matching ""