舉例解析Java的設計形式編程中裡氏調換准繩的意義。本站提示廣大學習愛好者:(舉例解析Java的設計形式編程中裡氏調換准繩的意義)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例解析Java的設計形式編程中裡氏調換准繩的意義正文
裡氏調換准繩,OCP作為OO的高層准繩,主意應用“籠統(Abstraction)”和“多態(Polymorphism)”將設計中的靜態構造改成靜態構造,保持設計的關閉性。“籠統”是說話供給的功效。“多態”由繼續語義完成。
裡氏調換准繩包括以下4層寄義:
如今我們可以對以上四層寄義停止講授。
子類可以完成父類的籠統辦法,然則不克不及籠罩父類的非籠統辦法
在我們做體系設計時,常常會設計接口或籠統類,然後由子類來完成籠統辦法,這裡應用的其實就是裡氏調換准繩。子類可以完成父類的籠統辦法很好懂得,現實上,子類也必需完整完成父類的籠統辦法,哪怕寫一個空辦法,不然會編譯報錯。
裡氏調換准繩的症結點在於不克不及籠罩父類的非籠統辦法。父類中但凡曾經完成好的辦法,現實上是在設定一系列的標准和契約,固然它不強迫請求一切的子類必需服從這些標准,然則假如子類對這些非籠統辦法隨意率性修正,就會對全部繼續系統形成損壞。而裡氏調換准繩就是表達了這一層寄義。
在面向對象的設計思惟中,繼續這一特征為體系的設計帶來了極年夜的方便性,然則由之而來的也潛伏著一些風險。上面舉例來講明繼續的風險,我們須要完成一個兩數相減的功效,由類A來擔任。
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)); } }
運轉成果:
100-50=50 100-80=20
後來,我們須要增長一個新的功效:完成兩數相加,然後再與100乞降,由類B來擔任。即類B須要完成兩個功效:
兩數相減。
兩數相加,然後再加100。
因為類A曾經完成了第一個功效,所以類B繼續類A後,只須要再完成第二個功效便可以了,代碼以下:
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完成後,運轉成果:
100-50=150 100-80=180 100+20+100=220
我們發明本來運轉正常的相減功效產生了毛病。緣由就是類B在給辦法起名時有意中重寫了父類的辦法,形成一切運轉相減功效的代碼全體挪用了類B重寫後的辦法,形成本來運轉正常的功效湧現了毛病。在本例中,援用基類A完成的功效,換成子類B以後,產生了異常。在現實編程中,我們經常會經由過程重寫父類的辦法來完成新的功效,如許寫起來固然簡略,然則全部繼續系統的可復用性會比擬差,特殊是應用多態比擬頻仍時,法式運轉失足的概率異常年夜。假如非要重寫父類的辦法,比擬通用的做法是:本來的父類和子類都繼續一個更淺顯的基類,原本的繼續關系去失落,采取依附、聚合,組合等關系取代。