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 方法。
您只需要创建一个实现接口(interface) IShape 的新类“Triangle”,并将其传递给 DrawShapes 方法即可。
此代码也是多态的,因为“DrawShapes”方法不需要知道它正在呈现的形状的类型。

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

关于oop - 开闭原则与多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754311/

相关文章:

ios - 子类中 self 和 super 之间的混淆

java - 是否值得将类的实例放入接口(interface)中?

language-agnostic - "program to an interface"是什么意思?

java - 依赖于抽象。不依赖于具体类

java - 没有实现的子类

c# - 我破坏了封装吗?

c++ - 我正在尝试 [在 C++ 中] 实践多态性和 OOD 原则。需要指导和回答几个问题

c# - 参数 Action<T1, T2, T3> 其中 T3 可选

java - 如何创建类的单个实例并多次使用它?

c++ - 在 C++ 中继承 C 结构并将其传递回 C 库是否安全?