【发布时间】:2021-01-05 21:40:27
【问题描述】:
C++、php、python等OOD语言允许覆盖基类的非抽象方法。
但是这种能力允许违反 Liskov 替换原则。因为在这种情况下,不能在不改变程序行为的情况下用派生类替换程序中的基类。
为什么?
【问题讨论】:
-
派生类的重点不是与基类有不同的行为吗?
-
我会做一个友好的赌注:在 C++ 中,我将创建一个名为
base的类,其方法名为“foo”。随意定义您想要的任何派生类,并将其传递给需要指针或引用base类的某个函数,该函数将调用其foo方法。你可以尝试任何你想要的东西,但无论你尝试什么,你都不会覆盖我对基类的foo的调用。 -
有时赋予人们使用 Git-R-Done 的能力也赋予人们在脚上开枪的能力。
-
纯虚函数很容易违反 LSP:
class Base { virtual float mul ( float x, float y ) = 0; }; class Sub { float mul ( float x, float y ) { return x + y; } };