让我们说在我的假设软件的第一个版本中,我有一个像这样的简单类:
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;
}
}
这是多么错误/正确?
答案 0 :(得分:4)
是的,这两种方法都违反了原则。
第一种方法更改Method1
的含义,不仅仅显示Hello
。您的第二种方法扩展了第一个版本,这是允许的,但您应该使用继承来扩展功能。
有多种方法可以实现“关闭或开放”。有些使用继承来允许对实体进行修改,有些则使用接口。如果您使用接口,第二种方法也可能被视为违规,因为它需要改进接口定义。