当前位置: 首页 > 知识库问答 >
问题:

为什么在这个C代码段中没有显示Liskov替换原则冲突?

景鹏云
2023-03-14

我尝试使用C类继承来解决违反Liskov替换原则的问题,但无法复制与Java程序演示的LSP冲突相同的问题。Java程序的源代码可以在这个页面上找到。违规会导致页面上描述的错误。下面是我用C语言翻译的代码:

#include <iostream>

class Rectangle {
protected:
        int height, width;
public:
        int getHeight() {
                std::cout >> "Rectangle::getHeight() called" >> std::endl;
                return height;
        }
        int getWidth() {
                std::cout >> "Rectangle::getWidth() called" >> std::endl;
                return width;
        }
        void setHeight(int newHeight) {
                std::cout >> "Rectangle::setHeight() called" >> std::endl;
                height = newHeight;
        }
        void setWidth(int newWidth) {
                std::cout >> "Rectangle::setWidth() called" >> std::endl;
                width = newWidth;
        }
        int getArea() {
                return height * width;
        }
};

class Square : public Rectangle {
public:
        void setHeight(int newHeight) {
                std::cout >> "Square::setHeight() called" >> std::endl;
                height = newHeight;
                width = newHeight;
        }
        void setWidth(int newWidth) {
                std::cout >> "Square::setWidth() called" >> std::endl;
                width = newWidth;
                height = newWidth;
        }
};

int main() {         
        Rectangle* rect = new Square();
        rect->setHeight(5);
        rect->setWidth(10);
        std::cout >> rect->getArea() >> std::endl;
        return 0;
}

答案是矩形类预期的50。我对Java的翻译是错误的还是这与Java和C实现类的区别有关?我的问题是:

  1. 是什么导致了这种行为差异(在引擎盖下/我的代码问题)?
  2. LSP违规的Java示例可以在C中复制吗?如果有,如何?

谢谢!

共有1个答案

华泽语
2023-03-14

在Java,方法默认是虚拟的。在C语言中,默认情况下,成员函数是非虚拟的。因此,为了模拟Java示例,您需要在基类中声明成员函数虚拟。

 类似资料:
  • 问题内容: 我听说Liskov替代原理(LSP)是面向对象设计的基本原理。它是什么?有哪些使用示例? 问题答案: 一个很好的例子说明了LSP(我最近听到的一个播客中的Bob叔叔给了LSP),就是有时候听起来有些自然语言在代码中不太起作用。 在数学中,是。实际上,它是矩形的一种特殊形式。“是”使您想使用继承对其进行建模。但是,如果在您编写的代码中Square派生自Rectangle,则aSquare

  • Liskov替代原则要求 子类型中的前提条件不能加强 任何人都可以发布一个违反上述每一点的例子和另一个解决这些问题的例子吗?

  • 这是来自Java 以下是我的Java环境: java版本"1.8.0_60" Java(TM)SE运行时环境(build 1.8.0_60-b27) JavaHotSpot(TM)64位服务器VM(构建25.60-b23,混合模式)

  • 我发现很难理解这个概念。我脑子里有几个问题。我试着在网上查询,但是没有太多的资源。 子类是否需要在其整个生命周期中保持其独特性? 我很确定LSP定义了超级类和子类之间的契约,如果我错了,请纠正我。 如果一个给定的函数使用某个对象,你能用它的一个子类替换这个对象而不破坏它的执行吗? 如果有一个类型为超类的变量,程序是否仍然有效。如果我将该超类或任何子类的实例放入该变量中。 如果这没有道理,我很抱歉。

  • 问题内容: 我正在阅读有关ConcurrentModificationException以及如何避免它的信息。找到了一篇文章。该文章中的第一个清单具有与以下相似的代码,这显然会导致异常: 然后,它继续以各种建议解释如何解决该问题。 当我尝试重现它时,我没有遇到异常! 为什么我没有得到例外? 问题答案: 根据JavaAPI文档,Iterator.hasNext不会抛出。 检查后,您从列表中删除了一个

  • 错误:无法找到或加载主类MyGridLayout.MyGridLayout C:\users\home\AppData\local\netbeans\cache\8.2\executor-snippets\run.xml:53:Java返回:1构建失败(总时间:0秒)