0

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

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

4

2 回答 2

2

是的,UML 允许在子类中定义超类中不存在的新操作。

这不一定违反里氏替换原则。子类的实例可以在需要超类实例的地方替换(但您不必利用这一点)。

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

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

于 2019-09-19T14:35:57.703 回答
-1

子类可以将新元素(如操作或属性)添加到更具体的类中,而这些新元素未在更通用的类中定义。此外,更具体的类可以覆盖函数、隐藏属性和实现抽象操作。我猜 LSP 意味着 Liskov 的替换原则。

如果违反或没有违反,则不是 UML 可以回答的句法问题;相反,它是关于推理类的含义的语义问题。考虑一下正方形是否比矩形更通用的经典示例。或者反之亦然?但在语法上两者是相同的,例如许多其他不太成问题的层次结构。

关于多态性的问题有点棘手。UML 没有明确地使用这个术语。但它明确指出,更具体的类(修饰符)的每个实例也是更通用的类(修饰符)的一个实例,并继承了它的所有特性。这意味着没有允许您仅继承实现的 UML 语法。

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

于 2019-09-18T20:09:52.367 回答