开/关原理和多态性

Dan*_*ira 1 oop

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

Pao*_*nti 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码对扩展开放,对修改不开放,因此遵循OCP原则。为什么?如果需要使应用程序能够绘制新形状(例如Triangle),则无需修改Render类的DrawShapes方法。 你只需要创建一个新的类“三角”实现接口IShape的,并把它传递给DrawShapes方法。 该代码也是多态的,因为“ DrawShapes”方法不需要知道其渲染的形状的类型。

注意一件事:终止OCP原则始终是战略性的。这是什么意思?这意味着您不能拥有100%禁止修改的代码。示例:如果您需要在圆之前绘制所有正方形会怎样?在这种情况下,您必须修改DrawShapes方法。也许使用策略模式,您可以注入策略以对形状的图形进行排序。