【问题标题】:How to Depict Either/Or Inheritance in a UML diagram?如何在 UML 图中描述非继承/继承?
【发布时间】:2017-06-04 17:21:34
【问题描述】:

假设我有一个类 CelebrityDog。 CelebrityDog 可以是 BigDog 或 SmallDog,具体取决于用户的需求。

它将继承其中一个的属性,但不会继承两者的属性。我将如何在 UML 图中描述这一点?

【问题讨论】:

标签: class inheritance uml


【解决方案1】:

UML 视角

很抱歉给了一个不愉快的答案,但是根据 UML 2.5 标准第 9.2.4.1 节,这在 UML 中是不可能的:

泛化定义泛化/专业化关系 分类器之间。每个泛化涉及一个特定的分类器 到更一般的分类器。
...
一个分类器的实例也是一个(间接)每一个的实例 它的概括。应用于实例的任何约束 概括也适用于分类器的实例。

换句话说,UML 中的继承关系是泛化和特化之间的关系。一个类可以是多个泛化类的特化,但总是同时发生(即多重继承。

设计视角

我将补充已经令人不快的答案,无论如何这是一个非常糟糕的设计,您将无法在大多数主流语言中实现。

您可以使用更接近实际关系的模型进行改进:

  • CelebrityDogDog (继承,总是如此)
  • Dog 有一个 DogSize(关联,即实现时的组合),它会随着时间而改变
  • DogSize 可以特化为 BigDogSizeSmallDogSize

等等!

【讨论】:

  • 如果你在泛化之间放置异或约束(你可以这样做),那么恕我直言,分类器的任何实例都只会从一个父级继承,除非泛化的语义忽略约束
  • @Peter 实际上,UML 语义认为泛化始终适用,因此 xor 约束无效!约束条件不允许与模型的含义相矛盾。就像关联:如果你有两个可选的(例如 0..1)关联,你可以在两者之间有一个异或约束。但是,如果您有两个强制性(例如 1..1)关联,则 xor 无效,因为它与始终适用的基数相矛盾。
【解决方案2】:

Dog 是顶级类。它不包含大小属性。 CelebrityDog 源自 Dog(与正常情况一样,EverydayDogs)。 BigDog 和 SmallDog 派生自 CelebrityDog。也许将他们的类名更改为 BigCelebrityDog 和 SmallCelebrityDog。

可以使用多重继承来解决这个问题,但这可能会令人困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2021-07-18
    • 2017-11-30
    • 2014-08-04
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多