里氏替換原則 - Liskov Substitution Principle - LSP

定義:子類可以擴展父類的功能,但不能改變父類原有的功能。
通俗的講:軟件中使用一個父類,那麼一定適用其子類,而且它察覺不出父類和子類的區別。即,把父類替換成它的子類,軟件行爲沒有變化。其中有四層含義:

  • 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法
  • 子類中可以增加自己特有的方法
  • 當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆
  • 當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格

舉例:老師類已經含有了getName函數,而語文老師類重新定義了getName函數,導致結構異常
老師類

// 頭文件定義
#include <string>
class Teacher
{
public:
	Teacher();
	virtual ~Teacher();

	virtual void teach();

	std::string getName();
	void setName(std::string name);

private:
	std::string name;
};

// 實現
std::string Teacher::getName()
{
	return name;
}

語文老師類中新增information函數,及重新定義了getName函數

std::string ChineseTeacher::getName()
{
	return "chinese";
}

void ChineseTeacher::information()
{
	std::cout << "My name is " + getName() + "." << std::endl;
	teach();
}

客戶端

#include "ChineseTeacher.h"

int main(int agrc, char* argv[])
{
	ChineseTeacher chineseTh;
	chineseTh.setName("zhangSan");
	chineseTh.information();

	getchar();
	return 0;
}

運行結果
在這裏插入圖片描述
源碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章