激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 舉例解析Java的設計模式編程中里氏替換原則的意義

舉例解析Java的設計模式編程中里氏替換原則的意義

2020-03-26 14:09卡奴達摩 JAVA教程

這篇文章主要介紹了Java的設計模式中里氏替換原則的意義,文中舉例來說明里氏替換原則中強調的繼承特性方面可能帶來的問題,需要的朋友可以參考下

里氏替換原則,OCP作為OO的高層原則,主張使用“抽象(Abstraction)”和“多態(Polymorphism)”將設計中的靜態結構改為動態結構,維持設計的封閉性。“抽象”是語言提供的功能。“多態”由繼承語義實現。

里氏替換原則包含以下4層含義:

  1. 子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。
  2. 子類中可以增加自己特有的方法。
  3. 當子類覆蓋或實現父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。
  4. 當子類的方法實現父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。

  現在我們可以對以上四層含義進行講解。

  子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法

  在我們做系統設計時,經常會設計接口或抽象類,然后由子類來實現抽象方法,這里使用的其實就是里氏替換原則。子類可以實現父類的抽象方法很好理解,事實上,子類也必須完全實現父類的抽象方法,哪怕寫一個空方法,否則會編譯報錯。

  里氏替換原則的關鍵點在于不能覆蓋父類的非抽象方法。父類中凡是已經實現好的方法,實際上是在設定一系列的規范和契約,雖然它不強制要求所有的子類必須遵從這些規范,但是如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞。而里氏替換原則就是表達了這一層含義。

  在面向對象的設計思想中,繼承這一特性為系統的設計帶來了極大的便利性,但是由之而來的也潛在著一些風險。下面舉例來說明繼承的風險,我們需要完成一個兩數相減的功能,由類A來負責。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class A{
  public int func1(int a, int b){
    return a-b;
  }
}
 
public class Client{
  public static void main(String[] args){
    A a = new A();
    System.out.println("100-50="+a.func1(100, 50));
    System.out.println("100-80="+a.func1(100, 80));
  }
}

 運行結果:

?
1
2
100-50=50
100-80=20

        后來,我們需要增加一個新的功能:完成兩數相加,然后再與100求和,由類B來負責。即類B需要完成兩個功能:
兩數相減。
兩數相加,然后再加100。
        由于類A已經實現了第一個功能,所以類B繼承類A后,只需要再完成第二個功能就可以了,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class B extends A{
  public int func1(int a, int b){
    return a+b;
  }
   
  public int func2(int a, int b){
    return func1(a,b)+100;
  }
}
 
public class Client{
  public static void main(String[] args){
    B b = new B();
    System.out.println("100-50="+b.func1(100, 50));
    System.out.println("100-80="+b.func1(100, 80));
    System.out.println("100+20+100="+b.func2(100, 20));
  }
}

類B完成后,運行結果:

?
1
2
3
100-50=150
100-80=180
100+20+100=220

        我們發現原本運行正常的相減功能發生了錯誤。原因就是類B在給方法起名時無意中重寫了父類的方法,造成所有運行相減功能的代碼全部調用了類B重寫后的方法,造成原本運行正常的功能出現了錯誤。在本例中,引用基類A完成的功能,換成子類B之后,發生了異常。在實際編程中,我們常常會通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多態比較頻繁時,程序運行出錯的幾率非常大。如果非要重寫父類的方法,比較通用的做法是:原來的父類和子類都繼承一個更通俗的基類,原有的繼承關系去掉,采用依賴、聚合,組合等關系代替。

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九热精品视频在线播放 | 女人一区二区三区 | 久久av免费| videos 欧美 | 国产精品久久久免费观看 | 国产精品久久久久国产精品三级 | 国产精品免费久久久久久 | 嫩嫩的freehdxxx | 国产91精品久久久久久久 | 黄色aaa视频 | 99在线精品视频免费观看20 | 精品国产一区二区三区久久久 | 久久99久久99精品 | 一级黄色大片在线观看 | 午夜精品一区二区三区免费 | 国产精品久久久久久婷婷天堂 | 精品久久久久久亚洲精品 | 久久777国产线看观看精品 | vidz 98hd | 91成人久久 | 国产高清在线观看av | 天天鲁在线视频免费观看 | 亚洲成年人免费网站 | 久久久成人一区二区免费影院 | 看中国一级毛片 | 91久久极品少妇韩国 | 91精品观看91久久久久久国产 | 国产精品午夜未成人免费观看 | 久久久久9999 | 午夜精品一区二区三区免费 | 伊久在线| 国产1区2| 成人男女视频 | 国产精品高潮99久久久久久久 | 免费毛片在线视频 | 韩国草草影院 | 欧美一级视频免费看 | 国产精品一区视频 | 成人aaaaa片毛片按摩 | 啪啪毛片 | 成人在线观看一区二区三区 |