The open/closed principle声明一个类应该是可以扩展的,但是关闭以进行修改。
我认为修改部分严格指的是改变基类的源代码。但我与某人说过,这也涉及从基类中重写方法。
这种解释是否正确?
答案 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的工具。