Java設計模式》 里斯替換原則(LSP)

2021-08-08 11:20:23 字數 1569 閱讀 8373

什麼里斯替換原則

定義1:如果對每乙個型別為s的物件o1,都有型別t的物件o2,在程式p中,使得t定義的o1都能替代成o2,而程式p的行為沒有發生變化,那麼型別s是型別t的子型別。

定義2:所有應用基類的地方必須能夠透明地使用其子類的物件。

2個定義都是可以的,只是第2種讀起來比較繞口,第2個比較簡潔,個人建議多品一品定義1。

里斯替換規則

其他類應該依賴父類或介面

//學生

class

student

//老師

class

teacher

}//學生張三

class

zhangsan

extends

student

class

teacherwang

}

看看上面的區別,teacher依賴的是student,而teacherwang依賴的是的zhangsan,可以說teacherwang是不符合lsp原則,當然我們在設計程式的時候,並不是全部都要使用這個原則,有的時候也是直接依賴子類的,這個要看具體的需求。

2. 子類必須完全是父類的方法

class

student

class

zhangsan

extends

student

}

我們看zhangsan是student的子類,但是沒有實現getstudentid()方法,假如學校門衛是根據學生證,讓你走進校園,如果沒有學生證,那就沒有資格進入校園,那就相當於不是學生。

過載父類的方法,引數型別》=過載引數 或 引數型別 != 過載引數

//父類

class

parent

}//子類

class

child

extends

parent

public

void test(map map){}

public

void test(string text){}

}//程式p

class

test

}//根據定義1,咱們把parent換成child,最終呼叫的還是parent裡面的方法。

反之看看成立嗎?

//父類

class

parent

}//子類

class

child

extends

parent

@override

public

void test(map map){}

public

void test(string text){}

}//程式p

class

test

}

替換之後發現child呼叫的不是父類的test(map map)方法,而是自己的test(hashmap hashmap)方法,不符合定義1,替換之後不印象程式p的功能。

設計模式 黎克特制替換原則

設計模式 黎克特制替換原則 物件導向的語言繼承必不可少的,有如下優點 共享,減少建立類的工作量 提高 的重用性 提高 的可擴充套件性 提高 的可擴充套件性 提高產品 的開放性 繼承侵入性 只要繼承,必須擁有父類的內容 降低 的靈活性,子類必須擁有父類的屬性和方法 增強耦合性。黎克特制替換原則,為繼承...

設計模式 (黎克特制替換原則)

黎克特制替換原則的引入 是針對物件導向中的繼承的缺點 乙個原則首先先介紹下它的定義 黎克特制替換原則為繼承定義了規範,下面我用書中看到的例子來說 1.子類必須完全實現父類的方法 首先先定義乙個槍的抽象類 public abstract class abstractgun 實現類的定義,不同的槍枝進行...

設計模式 黎克特制替換原則

設計模式 黎克特制替換原則 oo 中的繼承性的思考和說明 繼承包含這樣一層含義 父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然它不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。繼承在給程式設計帶來便利的同時,也帶來了弊端。比如使...