UML 类图中的里氏替换原则 (LSP)

问题描述 投票:0回答:1

isSubstitutable
属性是否意味着指定一个类及其泛化符合里氏替换原则(LSP)?如果没有,是否有一种简单的方法来指定泛化或泛化集的 LSP 合规性?

事实上,LSP 的定义如下(维基百科):

如果 S 是 T 的子类型,则程序中类型 T 的对象可以替换为类型 S 的对象,而不改变该程序的任何所需属性

原始定义略有不同,但原则是关于实例的,因此排除了约束的新实例的创建/构造,如 Liskov&Wing 的基础文章文章中所述:

对象通过创建者而存在并获得其初始值。不像 与其他类型的方法一样,创建者不属于特定对象,而是属于 都是独立运营。

但是在 UML 规范中

isSubstitutable
是基于分类器而不是实例来定义的:

指示在可以使用通用分类器的地方是否可以使用特定分类器。如果为真,则特定分类器的执行轨迹应是通用分类器的执行轨迹的超集。如果 false,执行跟踪没有这样的约束。如果未设置,则建模者未说明是否存在这样的约束。

这将使

isSubstitutable
变得不那么有用,因为这似乎意味着如果泛化和特化有不同的构造函数(通常是这种情况),它们将不可替代。 我是否过于字面地阅读 UML 规范而错过了某个地方?

oop language-lawyer uml class-diagram liskov-substitution-principle
1个回答
0
投票

简短回答。 如果

isSubstitutable = true
对于 UML 类图的概括,则遵循 里氏替换原则 (LSP)

Sparx Systems Forum 上讨论了类似的主题。

一些细节。

  1. 泛化的描述谈论了实例(您在没有考虑上下文的情况下获取了
    isSubstitutable
    属性的描述)。
  2. 如果泛化和特化有不同的构造函数,它们可以可替换。例如,一个
    Ellipse
    和一个
    Circle
    (圆是椭圆的一种特殊情况),有一个公共方法:
    area()
    。您可以将
    Circle
    实例传递给接受
    Ellipse
    实例的方法,它将继续正常工作。
    Ellipse
    Circle
    的构造函数将具有不同的构造函数(
    Ellipse
    在构造函数中有 2 个焦点,
    Circle
    有一个,因为它的两个焦点重合)。
© www.soinside.com 2019 - 2024. All rights reserved.