【问题标题】:Do I understand Open-Closed Principle right?我理解开闭原则吗?
【发布时间】:2017-03-06 07:10:51
【问题描述】:

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

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

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

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

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

}

这是多么错误/正确?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 在我看来,向原始类添加一个方法算作修改,不仅仅是像你说的那样的接口
    • 嗯,它不需要现有的代码来修改它,所以它只是一个扩展,对吧?
    • @AlexanderDerck "但它也是开放的,因为任何新类都可以将其用作父类,添加新功能。定义后代类时,无需更改原始类或干扰其客户。”
    • 是的,这就是我的意思,如果你继承它并添加额外的方法,则基类没有改变->“没有必要改变原来的”。所以严格来说我认为将其添加到基类中是违反o/c原则的
    • @AlexanderDerck 对不起,你完全正确。已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多