开/关原理和多态性

时间:2016-11-23 00:53:33

标签: oop

开放/封闭原则规定软件实体(类,模块等)应该开放以进行扩展,但是关闭以进行修改。我今天了解到这一点,我的老师说这个概念本质上与多态性的概念有关。我真的看不出两个概念是如何联系的,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:5)

这是我的出路。 请看以下示例:

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原则。为什么?如果您需要使应用程序能够绘制新形状(例如Triangle),则无需修改 Render 类的 DrawShapes 方法。 /> 您只需创建一个实现接口 IShape 的新类“Triangle”,并将其传递给 DrawShapes 方法。
此代码也是多态的,因为“DrawShapes”方法不需要知道它渲染的形状类型。

注意一件事:关闭O.C.P.原则总是战略。这是什么意思?这意味着您不能拥有100%关闭修改的代码。示例:如果您需要在圆圈之前绘制所有正方形,会发生什么?在这种情况下,您必须修改 DrawShapes 方法;也许使用策略模式,您可以注入策略来对形状的绘制进行排序。