首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开闭原理

开闭原理
EN

Stack Overflow用户
提问于 2017-06-28 08:19:05
回答 1查看 740关注 0票数 5

我了解到,这个原则规定模块是开放的,但对于修改来说是封闭的,当我们想升级/修改某个类中的方法时,这是很明显的--我们创建了另一个类,它继承基类,然后在这里重写基方法,以便保持这两个功能。

但是,当我们想向基类中添加另一个不同的方法时,情况如何?这被认为是基类的修改或扩展吗?可以将方法添加到基类中吗?还是我们也应该创建继承基类的新类,然后将新方法放在那里?

此外,在基类中添加属性和字段时也会遇到相同的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-28 09:28:35

TL;博士 我认为添加一个新方法本质上意味着您不能违反OCP;因为OCP主要关注现有方法的不计后果的覆盖

示例: 基类CalculatorMyCustomCalculator继承。基类只有两个数字的加、减、乘和除的方法。 在MyCustomCalculator中创建一个新方法,例如,CalculateAverage(params int[])不违反OCP。它不修改任何现有方法背后的逻辑,它仅仅是扩展了由计算器对象提供的方法

新方法本质上不会改变旧方法。因此,他们不修改现有的逻辑,然后简单地扩展可用的内容。

所以不,它(本质上)并不违反OCP。

它几乎不可能违反OCP,因为创建新的东西(本质上)与修改现有的东西完全不同。

不过,有些事情要注意:

  • 我可以想到一个(有争议的)例外:overloading.如果您创建了一个重载现有方法的新方法,那么您就有责任遵守重载规则。最值得注意的是,这意味着重载方法应该执行与彼此完全相同的任务(重载方法只是基于不同的输入参数,但它们的处理和输出在功能上应该是等价的)。尽管我不能100%确定这是否违反了OCP (因为它错误地扩展了一个基类)或SRP (因为它对重载方法的处理/输出产生了模糊的责任)。两者似乎都有点儿。
  • 即使您的新方法没有重载现有方法,也适用同样的原则。新方法是否与基类的责任(意图/目的)足够相关?因为如果它是非常不同的,那么您可能违反了SRP

编辑

我漏掉了你的部分问题

是否可以将该方法添加到基类中,或者我们也应该创建继承基类的新类,然后将新方法放在那里?

这取决于背景。对于我提供的Calculator / MyCustomCalculator / CalculateAverage()示例,我会本能地将其添加到基类中,因为计算平均值是与计算器的职责相关的基本操作。

但是,如果我们正在讨论添加一个只涉及复数(MethodForComplexNumbers())的方法,那么我将主张创建一个从Calculator继承并实现MethodForComplexNumbers()ComplexNumberCalculator

然而,我认为这主要是由于SRP,而不是OCP

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44797168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档