我理解这个原则声明一个模块是开放的扩展但是关闭以进行修改,当我们想要在某个类中升级/修改一个方法时,这是明确的 - 我们创建另一个继承基类然后重写的类这里的基本方法是为了保持两种功能。
但是当我们想要为基类添加另一个不同的方法时呢?这被认为是基类的修改或扩展 - 可以将方法添加到基类中,还是我们还应该创建继承基类然后将新方法放在那里的新类?
此外,同样的问题是向基类添加属性和字段。
答案 0 :(得分:5)
<强> TL; DR 强>
我认为添加一种新方法本身就意味着你不能违反OCP;因为OCP主要关注现有方法的鲁莽重写。
实施例
基类Calculator
由MyCustomCalculator
继承。基类只有添加,减去,乘以和除以两个数的方法 在MyCustomCalculator
中创建新方法,例如CalculateAverage(params int[])
并未违反OCP。它不会修改任何现有方法背后的逻辑,只是扩展计算器对象提供的方法。
新方法固有地不会改变旧方法。因此,他们不会修改现有的逻辑;然后简单地扩展可用的东西。
所以不,它不会(固有地)违反OCP。
它几乎不可能违反OCP,因为创建新东西(固有地)与修改存在的东西完全不同。
但有些事情需要注意:
修改强>
我错过了你的部分问题
将方法添加到基类是否可以,或者我们还应创建继承基类然后将新方法放在那里的新类?
这取决于背景。对于我提供的Calculator
/ MyCustomCalculator
/ CalculateAverage()
示例;我本能地将它添加到基类,因为计算平均值是一个与计算器职责相关的基本操作。
但是,如果我们讨论添加一个仅涉及复数(MethodForComplexNumbers()
)的方法,那么我会主张创建一个ComplexNumberCalculator
,它继承自Calculator
并实现{ {1}}。
但是,我认为这主要是由于 SRP ,而不是 OCP 。