詳解Java設計形式編程中的裡氏調換准繩。本站提示廣大學習愛好者:(詳解Java設計形式編程中的裡氏調換准繩)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java設計形式編程中的裡氏調換准繩正文
界說1:假如對每個類型為 T1的對象 o1,都有類型為 T2 的對象o2,使得以 T1界說的一切法式 P 在一切的對象 o1 都代換成 o2 時,法式 P 的行動沒有產生變更,那末類型 T2 是類型 T1 的子類型。
界說2:一切援用基類的處所必需能通明地應用其子類的對象。
成績由來:有一功效P1,由類A完成。現須要將功效P1停止擴大,擴大後的功效為P,個中P由原有功效P1與新功效P2構成。新功效P由類A的子類B來完成,則子類B在完成新功效P2的同時,有能夠會招致原有功效P1產生毛病。
處理計劃:當應用繼續時,遵守裡氏調換准繩。類B繼續類A時,除添加新的辦法完成新增功效P2外,盡可能不要重寫父類A的辦法,也盡可能不要重載父類A的辦法。
繼續包括如許一層寄義:父類中但凡曾經完成好的辦法(絕對於籠統辦法而言),現實上是在設定一系列的標准和契約,固然它不強迫請求一切的子類必需服從這些契約,然則假如子類對這些非籠統辦法隨意率性修正,就會對全部繼續系統形成損壞。而裡氏調換准繩就是表達了這一層寄義。
繼續作為面向對象三年夜特征之一,在給法式設計帶來偉大方便的同時,也帶來了弊病。好比應用繼續會給法式帶來侵入性,法式的可移植性下降,增長了對象間的耦合性,假如一個類被其他的類所繼續,則當這個類須要修正時,必需斟酌到一切的子類,而且父類修正後,一切觸及到子類的功效都有能夠會發生毛病。
例子:
public class Rectangle { int width; int height; public Rectangle(int w, int h){ width = w; height = h; } public int getArea(){ return width*height; } } public class Square extends Rectangle { public Square(int w, int h) { super(w, h); } public int getArea(){ return width*width; } } public class Test { public static void main(String[] args) { Rectangle rectangle = new Rectangle(10, 20); // Square rectangle = new Square(10, 20); System.out.println("面積:"+rectangle.getArea()); } }
假如我們把長方形類Rectangle 調換為正方形類Square,那末求出的面積就不准確了,緣由是我們繼續的時刻重寫了父類的getArea辦法。這是違反裡氏調換准繩的。
固然,這裡只是舉個例子,現實項目中我們不會如許修正的。
總結:
1. 盡可能不要重寫父類辦法,而是增長本身獨有的辦法。
2. 繼續給法式設計帶來偉大方便的同時,也帶來了弊病。假如一個類被其他的類所繼續,則當這個類須要修正時,必需斟酌到一切的子類,而且父類修正後,一切觸及到子類的功效都有能夠會發生BUG。