【发布时间】:2016-11-23 00:53:33
【问题描述】:
开放/封闭原则指出软件实体(类、模块等)应该对扩展开放,但对修改关闭。我今天了解到这个,我的老师说这个概念与多态性的概念有内在的联系。我真的看不出这两个概念是如何联系起来的,谁能解释一下吗?
【问题讨论】:
标签: oop
开放/封闭原则指出软件实体(类、模块等)应该对扩展开放,但对修改关闭。我今天了解到这个,我的老师说这个概念与多态性的概念有内在的联系。我真的看不出这两个概念是如何联系起来的,谁能解释一下吗?
【问题讨论】:
标签: oop
这是我的解释。 看下面的例子:
public interface IShape
{
void Draw();
}
public class Square : IShape
{
public void Draw()
{
// DRAW SQUARE
}
}
public class Circle : IShape
{
public void Draw()
{
// DRAW CIRCLE
}
}
public class Renderer
{
public void DrawShapes(ICollection<IShape> shapes)
{
foreach (var shape in shapes)
{
shape.Draw();
}
}
}
此代码对扩展开放,对修改关闭,因此它遵循 OCP 原则。为什么?如果您需要让应用程序能够绘制新形状(例如三角形),则无需修改 Render 类的 DrawShapes 方法。
您只需要创建一个实现接口IShape的新类“Triangle”并将其传递给DrawShapes方法。
这段代码也是多态的,因为“DrawShapes”方法不需要知道它正在渲染的形状的类型。
注意一件事:O.C.P.的关闭。原则总是战略性的。这是什么意思?这意味着您不能拥有 100% 禁止修改的代码。示例:如果您需要在圆圈之前绘制所有正方形,会发生什么?在这种情况下,您必须修改 DrawShapes 方法;也许使用策略模式,您可以注入策略来对形状的绘制进行排序。
【讨论】: