开闭原理(OCP)指出对象应打开以进行扩展,但应关闭以进行修改。我相信我理解它,并将其与SRP结合使用来创建仅做一件事的类。而且,我尝试创建许多小的方法,使所有行为控件都可以提取到可以在某些子类中扩展或重写的方法中。因此,我最终得到了具有许多扩展点的类,包括:依赖项注入和组合,事件,委托等。
考虑以下简单的可扩展类:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
现在说,例如,OvertimeFactor
更改为1.5。由于上述类是为扩展而设计的,因此我可以轻松地子类化并返回一个不同的OvertimeFactor
。
但是 ...尽管该类是为扩展而设计的,并且坚持使用OCP,但我将修改单个方法,而不是子类化和覆盖该方法,然后在IoC容器中重新连接对象。
结果,我违反了OCP尝试完成的部分工作。感觉就像是在偷懒,因为上面的内容要容易一些。我是否误解了OCP?我真的应该做些不同的事情吗?您是否以其他方式利用OCP的优势?
更新:根据答案,由于许多不同的原因,这个人为的例子似乎是一个糟糕的例子。该示例的主要目的是证明该类是通过提供以下方法来扩展的:该方法在被重写时将更改公共方法的行为,而无需更改内部或私有代码。不过,我绝对误会了OCP。