以下皆是個人理解如有不對請留言指出,謝謝!
我就代碼提出我自己個人的看法:
正常定義一個類例如銀行工作員,他可以執行存款,付款和轉賬功能,如果在現有功能上我想添加貸款功能,需要在類中添加新的功能對應的方法,那就會破壞類的封裝性,修改了源代碼。這時候就需要我們定義一個抽象類,他沒有具體的執行哪種工作,只是有一個抽象的工作的純虛函數。然后通過派生派生出具有若干具體功能的子類,之后如果我們想要添加新的功能就不要在類的內部進行修改,而是添加新的實現相應新功能的子類,這樣就不會破壞類的封裝性。這也體現了開放封閉的原則:類的改動是通過增加代碼進行的,而不是修改源代碼。
簡單來說就是:對擴展是開放的,而對修改是封閉的
對擴展開放:意味著有新的需求或變化時,可以對現有代碼進行擴展,以適應新的情況。
對修改封閉:意味著類一旦設計完成,就可以獨立完成其工作,而不要對類進行任何修改。
開放封閉原則實例:
#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;
}