繁体   English   中英

没有多态的UML泛化

[英]UML generalization without polymorphism

是否有可能在两个类之间建立泛化关系,其中子类会添加不在父类上的新操作(不覆盖,不重载)? 这不是LSP违规吗? 我不想多态,只是在子类中重复使用代码。

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

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

这不一定违反《里斯科夫换人原则》。 在需要超类实例的情况下,可以替换子类的实例(但您不必利用它)。

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

示例:StringCollection类具有操作排序。 现在,您想在名为FileManager的新类中重用此排序操作。 FileManager不仅是StringCollection,所以您不应使用概括。 相反,您可以使用“使用”依赖项(FileManager使用StringCollection)或组合(FileManager包含StringCollection)。

子类可以将新元素(如操作或属性)添加到更通用的类中未定义的更特定的类。 同样,更具体的类可以重写函数,隐藏属性并实现抽象操作。 我认为LSP意味着Liskov的替代原则。

如果违反或不违反该语法问题,则UML不能回答该问题; 相反,这是一个关于类的含义推理的语义问题。 考虑一个经典的例子,正方形是否比矩形更通用。 还是相反? 但是从语法上讲,两者是相同的,例如许多其他较少受质疑的层次结构。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM