9.2.3 Semantics
Classifiers
一个分类符拥有一组特征,其中的一些是Properties,称为分类符的attributes。每一个特征都是分类符的一个member(成员,参见7.4 Namespaces)。
由一个分类符所分类的值称为该分类符的实例。
分类符可以被重定义(见下)。
分类符可以拥有CollaborationUses,后者吧分类符关联到Collaborations。Collaborations描述了分类符的(不同)方面。参见11.7 Collaborations。
分类符可以拥有UseCases(用例)。参见18.1 Use Cases。
Generalization
泛化定义了分类符之间的泛化/特化关系。每个泛化将一个specific分类符关联到一个更加general的分类符上。给定一个分类符,它的general分类符传递闭包通常称为它的generalizations,它的specific分类符传递闭包称为它的specializations。直接的generalizations也称作分类符的父亲,当分类符是Class(类)时,称为它的superClasses(超类,参见11.4)。
注意. 父亲(分类符之间的泛化关系)的概念与拥有者(owner,不同实例间的组合关系)的概念无关。
分类符的实例也是每一个它的泛化的(间接)实例。任何应用在泛化实例上的约束也应用于分类符的实例上。
当分类符被泛化时,它的泛化的一些成员被继承,其行为如同这些成员被定义在继承的分类符自身一样。举个例子,一个attribute的被继承成员在任意的继承分类符的实例中都有一个值或一组值,一个操作(Operation)的被继承成员可以在继承分类符的实例上进行调用。
被继承的成员集合称为inheritedMembers。对于一个特定的分类符类型,除非特别指出,inheritedMembers是那些不具有私有可见性的成员。
类型兼容意味着如果一种类型兼容另一个,那么第一个类型的任意实例可以用作类型声明为第二个类型的TypedElement的值。分类符是一个类型,与其自身和它的所有泛化兼容。
当isAbstract为真,指示该分类符是抽象的,即不能有直接的实例:每一个抽象分类符的实例都应该是它的某个特化的一个实例。
如果一个分类符(父亲)泛化了另一个(孩子),孩子的实例必须在任何可能的场景下都可以替换父亲的实例。举个例子,圆可以被定义为椭圆的特化,它的实例在任何涉及访问一个椭圆的属性的场景下都是可以替换的。然而,如果椭圆定义了一个只修改它的主轴长度的延展行为,那么圆对象将不能实现类似行为。isSubstitutable属性可以用来指示是否一个特定的分类符可以用于任何该泛化分类符可以应用的场景。
Redefinition
特化分类符的一个泛化的任意成员(属于RedefinableElement)可以被重定义,而不是继承。重定义的目的是为了在特化分类符实例的上下文中增强、约束,或重载被重定义的成员。重定义发生时,重定义成员在被重定义的成员的位置上为特化分类符提供结构或行为,特别的,在特化分类符实例上下文中,任何指向被重定义成员的引用都应当归解为指向重定义成员(注意,为了避免环形的“任意引用”这里不包括redefinedElement引用自身)。
成员被重定义的分类符称为redefinitionContext。尽管在元模型中redefinitionContext的multiplicity为‘*’,但在UML规范中没有出现过多于一个redefinitionContext的场景。每种RedefinableElement都定义了redefinitionContext;它通常(但不总是)是成员的宿主(owner)。
重定义元素应该与它重定义的RedefinableElement相一致,但它可以增加特定的约束或者与特化redefinitionContext实例相关的其它细节,并且与general上下文的约束不矛盾。
一个重定义元素可以重定义多个RedefinableElements。而且,一个RedefinableElement可以被重定义多次,只要对于一个特定的实例应用哪个定义没有二义性就行。
对于一个特定的RedefinableElement,isLeaf为真指示它不应该有重定义。
重定义的具体语义随具体的RedefinableElement而不同。在被重定义的元素和它的重定义元素之间有几种不同的兼容性,例如名称兼容性(重定义元素与被重定义的元素具有相同的名字)、结构兼容性(客户可见的被重定义的元素的属性与重定义元素的属性相同),或行为兼容性(重定义元素可以替换被重定义的元素)。
分类符自身是一个RedefinableElement。这可以在一个分类符被内嵌到一个类或接口(它们成为redefinitionContext)的时候生效。在一个特化的类或接口上下文中重定义一个分类符可以使得在该特化类或接口实例中对被重定义的分类符的任意访问归解为对重定义分类符的访问。
Substitution
两个分类符之间的Substitution关系指明substitutingClassifier遵循contract分类符设定的契约。这暗示着substitutingClassifier的实例可以在运行时替代contract分类符的实例。Substitution依赖指示运行时的可替代性,它不基于特化。与特化不同,Substitution没有暗示结构的继承性,它只是遵循公开的契约。它需要:
- 被contract分类符实现的接口也被substitutingClassifier所实现,或者substitutingClassifier实现了一个更加特化的接口类型。
- 被contract分类符所拥有的任意Port都有一个相匹配的Port被substitutingClassifier所拥有。