以下皆是个人理解如有不对请留言指出,谢谢!
我就代码提出我自己个人的看法:
正常定义一个类例如银行工作员,他可以执行存款,付款和转账功能,如果在现有功能上我想添加贷款功能,需要在类中添加新的功能对应的方法,那就会破坏类的封装性,修改了源代码。这时候就需要我们定义一个抽象类,他没有具体的执行哪种工作,只是有一个抽象的工作的纯虚函数。然后通过派生派生出具有若干具体功能的子类,之后如果我们想要添加新的功能就不要在类的内部进行修改,而是添加新的实现相应新功能的子类,这样就不会破坏类的封装性。这也体现了开放封闭的原则:类的改动是通过增加代码进行的,而不是修改源代码。
简单来说就是:对扩展是开放的,而对修改是封闭的
对扩展开放:意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭:意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
开放封闭原则实例:
#include <iostream>
using namespace std;class BankWorker
{
public:void payM(){cout << "付款" << endl;}void saveM(){cout << "存款" << endl;}void zhuanzhang(){cout << "转账" << endl;}// ---------------- 增加新功能void daikuan(){cout << "贷款" << endl;}
};// 业务员的抽象类
class AbsBankWorker
{
public:virtual void work() = 0; // 业务员的工作
};// 负责付款的业务员
class PayMWorker : public AbsBankWorker
{
public:virtual void work(){cout << "付款" << endl;}
};// 负责存款的业务员
class SaveMWorker : public AbsBankWorker
{
public:virtual void work(){cout << "存款" << endl;}
};// 负责转账的业务员
class zhuanZhangWorker : public AbsBankWorker
{
public:virtual void work(){cout << "转账" << endl;}
};class DaikuanWorker:public AbsBankWorker
{
public:virtual void work(){cout << "贷款" << endl;}
};// 去银行办业务
void func(AbsBankWorker *abk)
{abk->work(); // 办业务
}int main()
{
/*BankWorker *bk = new BankWorker;bk->payM();bk->saveM();bk->zhuanzhang();
*/AbsBankWorker *abs = NULL;// 付款abs = new PayMWorker; // 找一个付款业务员func(abs);delete abs; // 业务结束,让人家离开// 存款abs = new SaveMWorker;func(abs);delete abs;// 转账abs = new zhuanZhangWorker;func(abs);delete abs;// ---------------------------// 贷款abs = new DaikuanWorker;func(abs);delete abs;return 0;
}