我对开闭原则的理解正确吗?

Iva*_*an 5 c# polymorphism inheritance open-closed-principle

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

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
       Console.WriteLine("World");
    }
}
Run Code Online (Sandbox Code Playgroud)

在第三个版本中,我进行了升级,需要向此类添加另一个方法,如下所示:

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

    public int Method2()
    {
        return 7;
    }    
}
Run Code Online (Sandbox Code Playgroud)

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

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

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是多么错误/正确?

Pat*_*man 4

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

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

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