gpt4 book ai didi

c# - 开闭原则

转载 作者:行者123 更新时间:2023-12-02 14:38:19 27 4
gpt4 key购买 nike

我理解这个原则规定模块对扩展开放,但对修改关闭,当我们想要升级/修改某个类中的方法时,这一点很明显 - 我们创建另一个继承基类的类,然后重写此处的基本方法是为了保留这两个功能。

但是当我们想向基类添加另一个不同的方法时该怎么办?这是否被视为基类的修改或扩展 - 可以将方法添加到基类中,还是我们还应该创建继承基类的新类,然后在那里放置新方法?

此外,向基类添加属性和字段也是同样的问题。

最佳答案

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 class Calculator is inherited by MyCustomCalculator. The base class only has methods for adding, subtracting, multiplying and dividing two numbers.
Creating a new method in MyCustomCalculator, 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,因为创建新内容(本质上)与修改现有内容完全不同。

<小时/>

需要注意的一些事项:

  • 我可以想到一个(有争议的)异常(exception)情况:重载。如果您创建一个重载现有方法的新方法,那么您有责任遵守重载规则。最值得注意的是,这意味着重载方法应该执行彼此完全相同的任务(重载方法只是基于不同的输入参数,但它们的处理和输出应该在功能上等效)。虽然我不能 100% 确定这是否违反 OCP(因为它错误地扩展了基类)或 SRP(因为它对重载方法的处理/输出产生了不明确的责任) )。似乎两者兼而有之。
  • 即使您的新方法没有重载现有方法,同样的原则也适用。新方法与基类的职责(意图/目的)足够相关吗?因为如果差异很大,那么您可能违反了建议零售价
<小时/>

编辑

我漏掉了你问题的一部分

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com