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