Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我理解开闭原理对吗?_C#_Inheritance_Polymorphism_Open Closed Principle - Fatal编程技术网

C# 我理解开闭原理对吗?

C# 我理解开闭原理对吗?,c#,inheritance,polymorphism,open-closed-principle,C#,Inheritance,Polymorphism,Open Closed Principle,假设在我假设软件的第一个版本中,我有一个简单的类,如下所示: public Class Version1 { public void Method1() { Console.WriteLine("Hello"); } } public Class Version1 { public void Method1() { Console.WriteLine("Hello"); Console.WriteLine("Wo

假设在我假设软件的第一个版本中,我有一个简单的类,如下所示:

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
    }
}
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;
    }

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

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
    }
}
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;
    }

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

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
    }
}
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;
    }

}
现在,就我对开闭原则的理解而言,在两次升级中,我都违反了这一原则,因为我修改了在我的软件的第一个版本中执行预期工作的类

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

public Class Version1
{
    public void Method1()
    {
       Console.WriteLine("Hello");
    }
}
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;
    }

}

这有多不对?

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

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


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

在我看来,向原始类添加一个方法算作修改,不仅对于像您sayWell这样的接口,它不需要修改依赖于它的现有代码,所以它只是一个扩展,对吗?@AlexanderDerck“但它也是开放的,因为任何新类都可以使用它作为父类,添加新功能。定义子类时,无需更改原始类或干扰其客户端。”是的,这就是我的意思,如果从它继承并添加额外的方法,基类没有更改->“没有必要更改原始类”。所以严格地说,我认为将其添加到基类是违反o/c的principle@AlexanderDerck对不起,你完全正确。更新。