覆盖是否违反了开放/封闭原则?

con*_*ist 8 oop open-closed-principle solid-principles

开放/封闭原则规定一个类应该开放以进行扩展,但是关闭以进行修改.

我认为修改部分严格指的是改变基类的源代码.但我与某人说过,这也涉及从基类中重写方法.

这个解释对吗?

Ste*_*ven 5

虚拟方法允许替换派生类中基类的行为,而无需更改基类,这意味着您遵守开放/封闭原则,因为您可以扩展系统而无需修改现有代码。

然而,基类(不是纯粹抽象的)往往会违反依赖倒置原则,因为派生类依赖于基类,而基类是一个具体组件而不是一个抽象。请记住,DIP规定

高级模块应该[...]依赖于抽象。

除此之外,如果基类定义了多个公共(或受保护)方法,而派生类型并未全部使用这些方法,则它们也往往会违反接口隔离原则。这是对 ISP 的侵犯,因为:

任何客户端都不应被迫依赖于它不使用的方法


usr*_*usr 2

覆盖很像任何人都可以注册的回调。就像是:

if (IsOverridden) CallCallback();
else DefaultImplementation(); //possibly empty
Run Code Online (Sandbox Code Playgroud)

从这个意义上说,没有任何修改。您只是重新配置对象来调用回调,而不是执行默认行为。

就像按钮的点击事件一样。您不会将订阅事件视为修改。是延伸。