日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
設(shè)計模式6大原則:里氏置換原則

里氏置換原則(Liskov Substitution Principle),簡稱LSP

10年積累的成都做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有日喀則免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

定義:

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

所有引用基類的地方必須能夠透明的使用其子類對象。

也就是說,只要父類出現(xiàn)的地方子類就能夠出現(xiàn),而且替換為子類不會產(chǎn)生任何錯誤或異常。但是反過來,子類出現(xiàn)的地方,替換為父類就可能出現(xiàn)問題了。

這個原則是為良好的繼承定義一個規(guī)范,簡單的講,有4層含義:

一、子類必須完全實現(xiàn)父類的方法

定義一個抽象類

 
 
 
  1. public abstract class ViewPoint {
  2.     //去麗江旅游
  3.     public abstract void where();
  4. }

下面兩個類是實現(xiàn)這個抽象類

 
 
 
  1. public class Lijiang extends ViewPoint {
  2.  
  3.     @Override
  4.     public void where() {
  5.         System.out.println("歡迎來到麗江...");
  6.     }
  7.  
  8. }
  9. public class Zhangjiajie extends ViewPoint {
  10.  
  11.     @Override
  12.     public void where() {
  13.         System.out.println("歡迎來到張家界...");
  14.     }
  15.  
  16. }

人物是涂涂,在里面設(shè)置類類型來傳遞參數(shù)。此時涂涂要去的旅游景點還是抽象的

 
 
 
  1. public class Tutu {
  2.     //定義要旅游的景點
  3.     private ViewPoint viewpoint;
  4.     //涂涂要去的景點
  5.     public void setViewPoint(ViewPoint viewpoint)
  6.     {
  7.         this.viewpoint = viewpoint;
  8.     }
  9.      
  10.     public void travelTo()
  11.     {
  12.         System.out.println("涂涂要去旅游了");
  13.         viewpoint.where();
  14.     }
  15. }

場景類。設(shè)置具體要去的景點

 
 
 
  1. public class Sence {
  2.     public static void main(String args[])
  3.     {
  4.         Tutu tutu = new Tutu();
  5.         //設(shè)置要去的旅游景點
  6.         tutu.setViewPoint(new Lijiang());
  7.         tutu.travelTo();
  8.     }
  9. }

運行結(jié)果:

涂涂要去旅游了
歡迎來到麗江...

二、子類可以有自己的特性

也就是說在類的子類上,可以定義其他的方法或?qū)傩?/p>

三、覆蓋或者實現(xiàn)父類的方法時輸入?yún)?shù)可以被放大

父類能夠存在的地方,子類就能存在,并且不會對運行結(jié)果有變動。反之則不行。

父類,say()里面的參數(shù)是HashMap類型,是Map類型的子類型。(因為子類的范圍應(yīng)該比父類大)

 
 
 
  1. import java.util.Collection;
  2. import java.util.HashMap;
  3.  
  4. public class Father {
  5.     public Collection say(HashMap map)
  6.     {
  7.         System.out.println("父類被執(zhí)行...");
  8.         return map.values();
  9.     }
  10. }

子類,say()里面的參數(shù)變成了Map類型,Map范圍比HashMap類型大,符合LSP原則。注意這里的say不是覆寫父類的say,因為參數(shù)類型不同。而是重載。

 
 
 
  1. import java.util.Collection;
  2. import java.util.Map;
  3.  
  4. /*
  5.  * 子類繼承了父類的所有屬性
  6.  */
  7. public class Son extends Father {
  8.     //方法輸入?yún)?shù)類型
  9.     public Collection say(Map map)
  10.     {
  11.         System.out.println("子類被執(zhí)行...");
  12.         return map.values();
  13.     }
  14. }

場景類

 
 
 
  1. import java.util.HashMap;
  2.  
  3. public class Home {
  4.     public static void main(String args[])
  5.     {
  6.         invoke();
  7.     }
  8.      
  9.     public static void invoke()
  10.     {
  11.         //父類存在的地方,子類就應(yīng)該能夠存在
  12.         //Father f = new Father();
  13.         Son s = new Son();
  14.         HashMap map = new HashMap();
  15.         //f.say(map);
  16.         s.say(map);
  17.     }
  18. }

無論是用父類還是子類調(diào)用say方法,得到的結(jié)果都是

父類被執(zhí)行...

但是,如果將上面Father里的say參數(shù)改為Map,子類Son里的say參數(shù)改為HashMap,得到的結(jié)果就變成了

f.say(map)結(jié)果:父類被執(zhí)行...

s.say(map)結(jié)果: 子類被執(zhí)行...

這樣會造成邏輯混亂。所以子類中方法的前置條件必須與父類中被覆寫的前置條件相同或者更寬。

四、覆寫或者實現(xiàn)父類的方法時輸出結(jié)果可以被縮小

其實與上面的類似,也就是父類能出現(xiàn)的地方子類就可以出現(xiàn),而且替換為子類不會產(chǎn)生任何錯誤或者異常,使用者也無需知道是父類還是子類。但是反過來就不行了,有子類出現(xiàn)的地方,父類未必就適應(yīng)。(畢竟子類的范圍要>=父類的范圍)


網(wǎng)頁標題:設(shè)計模式6大原則:里氏置換原則
網(wǎng)址分享:http://www.5511xx.com/article/dhdpcdg.html