- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我理解这个原则规定模块对扩展开放,但对修改关闭,当我们想要升级/修改某个类中的方法时,这一点很明显 - 我们创建另一个继承基类的类,然后重写此处的基本方法是为了保留这两个功能。
但是当我们想向基类添加另一个不同的方法时该怎么办?这是否被视为基类的修改或扩展 - 可以将方法添加到基类中,还是我们还应该创建继承基类的新类,然后在那里放置新方法?
此外,向基类添加属性和字段也是同样的问题。
最佳答案
<小时/>TL;DR
I think adding a new method inherently means that you cannot violate OCP; as OCP mainly focuses on the reckless overriding of existing methods.
Example:
Base classCalculator
is inherited byMyCustomCalculator
. The base class only has methods for adding, subtracting, multiplying and dividing two numbers.
Creating a new method inMyCustomCalculator
, e.g.CalculateAverage(params int[])
does not violate OCP. It does not modify the logic behind any of the existing methods, it merely extends the methods that are provided by the calculator object.
新方法本质上不会改变旧方法。因此,他们不会修改现有的逻辑;然后简单地扩展可用的内容。
所以不,它(本质上)并不违反 OCP。
它几乎不可能违反 OCP,因为创建新内容(本质上)与修改现有内容完全不同。
<小时/>需要注意的一些事项:
编辑
我漏掉了你问题的一部分
is it ok to add the method to the base class or we should also create new class that inherits the base class and then put new method there?
这取决于上下文。对于我提供的 Calculator
/MyCustomCalculator
/CalculateAverage()
示例;我会本能地将它添加到基类中,因为计算平均值是属于计算器职责的基本操作。
但是,如果我们讨论添加一个仅与复数相关的方法 (MethodForComplexNumbers()
),那么我会建议创建一个继承自的 ComplexNumberCalculator
计算器
并实现MethodForComplexNumbers()
。
不过,我认为这主要是由于SRP,而不是OCP。
关于c# - 开闭原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44797168/
我是一名优秀的程序员,十分优秀!