【发布时间】:2017-06-04 17:21:34
【问题描述】:
假设我有一个类 CelebrityDog。 CelebrityDog 可以是 BigDog 或 SmallDog,具体取决于用户的需求。
它将继承其中一个的属性,但不会继承两者的属性。我将如何在 UML 图中描述这一点?
【问题讨论】:
标签: class inheritance uml
假设我有一个类 CelebrityDog。 CelebrityDog 可以是 BigDog 或 SmallDog,具体取决于用户的需求。
它将继承其中一个的属性,但不会继承两者的属性。我将如何在 UML 图中描述这一点?
【问题讨论】:
标签: class inheritance uml
UML 视角
很抱歉给了一个不愉快的答案,但是根据 UML 2.5 标准第 9.2.4.1 节,这在 UML 中是不可能的:
泛化定义泛化/专业化关系 分类器之间。每个泛化涉及一个特定的分类器 到更一般的分类器。
...
一个分类器的实例也是一个(间接)每一个的实例 它的概括。应用于实例的任何约束 概括也适用于分类器的实例。
换句话说,UML 中的继承关系是泛化和特化之间的关系。一个类可以是多个泛化类的特化,但总是同时发生(即多重继承。
设计视角
我将补充已经令人不快的答案,无论如何这是一个非常糟糕的设计,您将无法在大多数主流语言中实现。
您可以使用更接近实际关系的模型进行改进:
CelebrityDog 是 Dog (继承,总是如此)Dog 有一个 DogSize(关联,即实现时的组合),它会随着时间而改变DogSize 可以特化为 BigDogSize 或 SmallDogSize
等等!
【讨论】:
Dog 是顶级类。它不包含大小属性。 CelebrityDog 源自 Dog(与正常情况一样,EverydayDogs)。 BigDog 和 SmallDog 派生自 CelebrityDog。也许将他们的类名更改为 BigCelebrityDog 和 SmallCelebrityDog。
可以使用多重继承来解决这个问题,但这可能会令人困惑。
【讨论】: