我理解开放式原则吗?

时间:2016-10-24 13:20:48

标签: c# inheritance polymorphism open-closed-principle

让我们说在我的假设软件的第一个版本中,我有一个像这样的简单类:

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
    }
}

在第二个版本中,我进行了升级,需要修改方法1,如下所示:

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
       Console.WriteLine("World");
    }
}

在第三版中,我进行了升级,需要在此类中添加另一种方法:

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
       Console.WriteLine("World");
    }

    public int Method2()
    {
        return 7;
    }    
}

现在,根据我对Open-Closed原理的理解,在两次升级中,我都违反了这个原则,因为我修改了在我的软件的第一个版本中正在进行所需工作的类。

我认为应该这样做,但不确定是否正确,就像这样:

public virtual Class Version1
{
    public virtual void Method1()
    {
       Console.WriteLine("Hello");
    }
}

public virtual Class Version2 : Version1
{
    public override void Method1()
    {
       Console.WriteLine("Hello");
       Console.WriteLine("World");
    }
}  

public Class Version3 : Version2
{      
    public int Method2()
    {
        return 7;
    }

}

这是多么错误/正确?

1 个答案:

答案 0 :(得分:4)

是的,这两种方法都违反了原则。

第一种方法更改Method1的含义,不仅仅显示Hello。您的第二种方法扩展了第一个版本,这是允许的,但您应该使用继承来扩展功能。

有多种方法可以实现“关闭或开放”。有些使用继承来允许对实体进行修改,有些则使用接口。如果您使用接口,第二种方法也可能被视为违规,因为它需要改进接口定义。