没有多态性的 UML 泛化

UML generalization without polymorphism

是否可以在两个类之间建立泛化关系,其中子类添加超类上没有的新操作(不是覆盖,不是重载)?不违反LSP?我不要多态性,只是重用 sub类.

中的代码

编辑:超类是抽象的,部分定义

子class 可以向更具体的 class 添加新元素,如操作或属性,这些元素在更通用的 class 中没有定义。还有更具体的class可以覆盖函数,隐藏属性,实现抽象操作。我猜 LSP 意味着 Liskov 的替代原则。

是否违反这不是语法问题,而是 UML 可以回答的问题;相反,它是关于推理 classes 的含义的语义问题。考虑 class 正方形是否比矩形更通用的例子。或者反之亦然?但在语法上两者是相同的,例如许多其他不太值得怀疑的层次结构。

关于多态性的问题有点棘手。 UML 没有明确地使用这个术语。但它清楚地指出,更具体的 class(ifier) 的每个实例也是更通用的 class(ifier) 的实例,并继承其所有功能。这意味着没有允许您仅继承实现的 UML 语法。

但是您可以通过应用合适的设计模式轻松解决这个问题。这个问题不够具体,无法判断 模式是最合适的模式,但好的候选者是策略或桥梁模式。然后你在实现你的算法的 classes 之间有完整的继承(它们可以是私有的或不那么可见 - 取决于语言),但是客户端使用的 classes 没有泛化关系,因此不能以多态方式使用。

是的,UML 允许在子class 中定义超class.

中不存在的新操作

这不一定违反里氏替换原则。 subclass 的实例可以替换为 superclass 的实例(但你不必利用它)。

但是,请确保您的 subclass 的实例也确实可以被视为 superclass 的实例。如果不是这种情况,而您只想重用代码,则泛化不是正确的解决方案。

示例: Class StringCollection 有一个操作排序。现在,您想在名为 FileManager 的新 class 中重用此排序操作。 FileManager 不仅仅是一个 StringCollection,因此您不应使用泛化。相反,您可以使用 ≪use≫-dependency(FileManager 使用 StringCollection)或组合(FileManager 包含 StringCollection)。