isSubstitutable
属性是否意味着指定一个类及其泛化符合里氏替换原则(LSP)?如果没有,是否有一种简单的方法来指定泛化或泛化集的 LSP 合规性?
事实上,LSP 的定义如下(维基百科):
如果 S 是 T 的子类型,则程序中类型 T 的对象可以替换为类型 S 的对象,而不改变该程序的任何所需属性
原始定义略有不同,但原则是关于实例的,因此排除了约束的新实例的创建/构造,如 Liskov&Wing 的基础文章文章中所述:
对象通过创建者而存在并获得其初始值。不像 与其他类型的方法一样,创建者不属于特定对象,而是属于 都是独立运营。
但是在 UML 规范中
isSubstitutable
是基于分类器而不是实例来定义的:
指示在可以使用通用分类器的地方是否可以使用特定分类器。如果为真,则特定分类器的执行轨迹应是通用分类器的执行轨迹的超集。如果 false,执行跟踪没有这样的约束。如果未设置,则建模者未说明是否存在这样的约束。
这将使
isSubstitutable
变得不那么有用,因为这似乎意味着如果泛化和特化有不同的构造函数(通常是这种情况),它们将不可替代。 我是否过于字面地阅读 UML 规范而错过了某个地方?
简短回答。 如果
isSubstitutable = true
对于 UML 类图的概括,则遵循 里氏替换原则 (LSP)。
在 Sparx Systems Forum 上讨论了类似的主题。
一些细节。
isSubstitutable
属性的描述)。Ellipse
和一个 Circle
(圆是椭圆的一种特殊情况),有一个公共方法:area()
。您可以将 Circle
实例传递给接受 Ellipse
实例的方法,它将继续正常工作。 Ellipse
和 Circle
的构造函数将具有不同的构造函数(Ellipse
在构造函数中有 2 个焦点,Circle
有一个,因为它的两个焦点重合)。