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

时间:2016-06-14 11:41:00

标签: oop solid-principles open-closed-principle

The open/closed principle声明一个类应该是可以扩展的,但是关闭以进行修改。

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

这种解释是否正确?

4 个答案:

答案 0 :(得分:4)

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

然而,基类(不纯粹是抽象的)往往会违反Dependency Inversion Principle,因为派生类依赖于基类,而基类是具体的组件而不是抽象。请记住,DIP states

  

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

除此之外,如果基类定义了多个未被派生类型使用的公共(或受保护)方法,则它们也会违反Interface Segregation Principle。这违反了ISP,因为:

  

不应该强迫任何客户端依赖它不使用的方法

答案 1 :(得分:2)

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

if (IsOverridden) CallCallback();
else DefaultImplementation(); //possibly empty

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

就像按钮的点击事件一样。您不会考虑订阅修改事件。这是扩展。

答案 2 :(得分:1)

“我认为修改部分严格指的是改变基类的源代码。”

您认为正确

有许多方法可以使类可扩展,并允许从中继承它是其中之一。关键字extend甚至在几种语言中用于启用继承,这使我们很明显我们没有修改,我们正在扩展......

继承是否是可扩展性的正确解决方案是另一个问题,但通常情况并非如此。组合应该是使类可扩展的首选方法(例如策略,观察者,装饰器,管道和过滤器等......)

答案 3 :(得分:0)

表格“通过C#自适应代码”一书,虚拟方法是实现OCP的工具。