开闭原则
开闭原则(Open/Closed Principle)规定 :
“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”
--《Object-Oriented Software Construction》作者 Bertrand Meyer
开闭原则意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。类的改动是通过增加代码实现,而不是修改源代码。
开闭原则 有 梅耶开闭原则、多态开闭原则。
梅耶开闭原则
代码一旦完成,一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。
特点:继承,子类继承父类,拥有其所有的方法,并且拓展。
多态开闭原则
此原则使用接口而不是父类来允许不同的实现,您可以在不更改它们的代码的情况下轻松替换它们。
现在大多数情况下,开闭原则指的是多态开闭原则。
多态开闭原则笔者在查阅资料是,发现这个接口指的不是 Interface ,指的是抽象方法、虚方法。
问:面向对象的三大特性是什么?答:封装、继承、多态。
对,多态开闭原则就是指这个多态。不过,原则要求不应对方法进行重载(重写)、隐藏。
这是一个示例:
// 实现登录注销
public class UserLogin
{
public void Login() { }
public void Logout() { }
public virtual void A() {/* 做了一些事*/}
public virtual void B() {/* 也做了一些事*/ }
}
public class UserLogin1 : UserLogin
{
public void Login(string userName) { } // 应不应该对父类的方法进行重载?
public override void A() { } // √
public override void B() { } // √
public new void Logout() { } // 也许行?
}
多态开闭原则的好处是,引入了抽象,使得两个类松耦合,而且可以使得在不修改代码的前提下,使用子类替换父类(里氏替换原则)。
有时,会看到这样的题目:接口和抽象类的区别?
笔者隐约记得有过一条这样的解释:接口是为了实现共同的标准;抽象是为了代码的复用。
当然,接口和抽象,都可以实现里氏替换。
通过开闭原则,我们可以了解到多态,也了解接口和抽象的应用场景。
还有一个问题是,开闭原则要求是要修改或添加功能时,通过子类来实现,而不是修改原有代码。那么是否可以和应该对父类的代码进行重载和隐藏?
而开闭原则的核心是构造抽象,从而通过子类派生来实现拓展。貌似没有说到这方面。
笔者觉得不太应该。。。
先结合下面的里氏替换原则,我们再讨论这个问题?










