Inheritance 无多态性的UML泛化

Inheritance 无多态性的UML泛化,inheritance,uml,code-reuse,liskov-substitution-principle,generalization,Inheritance,Uml,Code Reuse,Liskov Substitution Principle,Generalization,两个类之间是否可能存在泛化关系,其中子类添加了不在超类上的新操作—不重写、不重载?这不是LSP违规吗?我不想要多态性,只是在子类中重用代码 编辑:超类是抽象的,部分定义的子类可以向更一般的类中未定义的更具体的类添加新元素,如操作或属性。更具体的类还可以重写函数、隐藏属性和实现抽象操作。我猜LSP是指Liskov的替换原理 如果这是违反或没有是一个语法问题,而不是可以回答的UML;相反,这是一个关于类的语义推理的语义问题。考虑一个经典的例子,一个正方形是否比矩形更一般。还是反之亦然?但在句法上两者

两个类之间是否可能存在泛化关系,其中子类添加了不在超类上的新操作—不重写、不重载?这不是LSP违规吗?我不想要多态性,只是在子类中重用代码


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

子类可以向更一般的类中未定义的更具体的类添加新元素,如操作或属性。更具体的类还可以重写函数、隐藏属性和实现抽象操作。我猜LSP是指Liskov的替换原理

如果这是违反或没有是一个语法问题,而不是可以回答的UML;相反,这是一个关于类的语义推理的语义问题。考虑一个经典的例子,一个正方形是否比矩形更一般。还是反之亦然?但在句法上两者都是相同的,就像许多其他不那么可疑的等级制度一样

关于多态性的问题有点棘手。UML没有明确使用这个术语。但它清楚地表明,更具体的分类器的每个实例也是更通用的分类器的实例,并继承其所有特征。这意味着没有允许您只继承实现的UML语法


但是,通过应用合适的设计模式,您可以很容易地解决这个问题。这个问题不够具体,无法判断女巫模式是否最合适,但好的候选者是策略或桥梁模式。然后,实现算法的类之间就有了完整的继承,它们可以是私有的,也可以是不可见的,这取决于语言,但客户端使用的类没有泛化关系,因此不能以多态方式使用。

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

这不一定违反了Liskov替代原则。子类的实例可以替换为超类的实例,但您不必利用它

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

例如:
类StringCollection具有排序操作。现在,您希望在名为FileManager的新类中重用此排序操作。FileManager不仅仅是一个StringCollection,所以不应该使用泛化。相反,您可以使用≪使用≫-依赖项文件管理器使用StringCollection或组合文件管理器包含StringCollection。

Uhm。。。谢谢,现在更清楚了,但是。。。如果我不想尊重LSP,也不想有一个政治解决方案,像我的建议这样的解决方案是正确的吗?我的意思是:我希望子类为1。具有超类的操作;2.覆盖超类的抽象方法;3.下面是添加超类没有的新操作的问题。它在形式上正确吗?子类可以用来替换超类LSP,但我的疑问在于第3点:我可以向子类添加新的操作吗?不是polimorphism,好吧,但我不知道它是否正式正确,当然你可以。这是泛化关系的一部分以及它们被引入的原因。@ SIM考虑使用段落使你的答案可读并且运行拼写检查谢谢!你是说如果超类和子类在概念上处于一种is-a-king的关系中?是的,这就是我的意思!的确关于LSP,也许需要多加注意:添加到子类中的新操作不应违反历史约束,即在不使用超类操作的情况下,它不应更改超类的状态。@Christophe,谢谢,你说得对。我已将“不违反LSP”替换为“不一定违反LSP”。