我了解到,这个原则规定模块是开放的,但对于修改来说是封闭的,当我们想升级/修改某个类中的方法时,这是很明显的--我们创建了另一个类,它继承基类,然后在这里重写基方法,以便保持这两个功能。
但是,当我们想向基类中添加另一个不同的方法时,情况如何?这被认为是基类的修改或扩展吗?可以将方法添加到基类中吗?还是我们也应该创建继承基类的新类,然后将新方法放在那里?
此外,在基类中添加属性和字段时也会遇到相同的问题。
发布于 2017-06-28 09:28:35
TL;博士 我认为添加一个新方法本质上意味着您不能违反OCP;因为OCP主要关注现有方法的不计后果的覆盖。
示例: 基类
Calculator由MyCustomCalculator继承。基类只有两个数字的加、减、乘和除的方法。 在MyCustomCalculator中创建一个新方法,例如,CalculateAverage(params int[])不违反OCP。它不修改任何现有方法背后的逻辑,它仅仅是扩展了由计算器对象提供的方法。
新方法本质上不会改变旧方法。因此,他们不修改现有的逻辑,然后简单地扩展可用的内容。
所以不,它(本质上)并不违反OCP。
它几乎不可能违反OCP,因为创建新的东西(本质上)与修改现有的东西完全不同。
不过,有些事情要注意:
编辑
我漏掉了你的部分问题
是否可以将该方法添加到基类中,或者我们也应该创建继承基类的新类,然后将新方法放在那里?
这取决于背景。对于我提供的Calculator / MyCustomCalculator / CalculateAverage()示例,我会本能地将其添加到基类中,因为计算平均值是与计算器的职责相关的基本操作。
但是,如果我们正在讨论添加一个只涉及复数(MethodForComplexNumbers())的方法,那么我将主张创建一个从Calculator继承并实现MethodForComplexNumbers()的ComplexNumberCalculator。
然而,我认为这主要是由于SRP,而不是OCP。
https://stackoverflow.com/questions/44797168
复制相似问题