免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
面向?qū)ο蟮脑O(shè)計(jì)原則四 - 里氏代換原則 - 森林狼 - JavaEye技術(shù)網(wǎng)站

動(dòng)機(jī)

當(dāng)我們?cè)O(shè)計(jì)程序模塊時(shí),我們會(huì)創(chuàng)建一些類層次結(jié)構(gòu),然后我們通過(guò)擴(kuò)展一些類來(lái)創(chuàng)建它們的子類。

我們必須確保子類只是擴(kuò)展而沒(méi)有替換父類的功能,否則當(dāng)我們?cè)谝延谐绦蚰K中使用它們時(shí)將會(huì)產(chǎn)生不可預(yù)料的結(jié)果。

 

里氏代換原則表明當(dāng)一個(gè)程序模塊使用基類時(shí),基類的引用可以被子類替換而不影響模塊的功能。

 

里氏代換原則

基類完全能夠被子類替代而不影響模塊的功能。

 

實(shí)例

 

對(duì)于多態(tài)來(lái)說(shuō)里氏代換原則好像是很顯然的事情,例如:

Java代碼
  1. public void drawShape(Shape s) {   
  2. // Code here.   
  3. }  

 

對(duì)于Shape的任何子類來(lái)說(shuō),drawShape方法都應(yīng)該能很好的工作。我們必須小心的實(shí)現(xiàn)子類以免無(wú)意中違反了里氏代換原則,如果一個(gè)函數(shù)不滿足里氏代換原則,那么它可能必須顯式地引用子類對(duì)象,這樣的函數(shù)同樣違反了開(kāi)閉原則,因?yàn)楫?dāng)添加新的子類時(shí),必須修改它。

考慮下面的矩形類:

Java代碼
  1. // A very nice Rectangle class.   
  2. public class Rectangle {   
  3.   private double width;   
  4.   private double height;   
  5.   public Rectangle(double w, double h) {   
  6.     width = w;   
  7.     height = h;   
  8.   }   
  9.   public double getWidth() {return width;}   
  10.   public double getHeight() {return height;}   
  11.   public void setWidth(double w) {width = w;}   
  12.   public void setHeight(double h) {height = h;}   
  13.   public double area() {return (width * height);   
  14. }  

 

現(xiàn)在,如果有個(gè)正方形呢?顯然正方形是一個(gè)矩形,所以我們應(yīng)該讓正方形繼承矩形類,是這樣嗎?我們看一下!

 

注意:

  • 正方形不需要同時(shí)具有寬和高屬性,但是它還是從矩形繼承了這些屬性。所以,每個(gè)正方形都浪費(fèi)了一點(diǎn)空間,但這不是我們關(guān)注的主要問(wèn)題。
  • 繼承而來(lái)的setWidth()和setHeight()方法實(shí)際上對(duì)于正方形是不合適的,因?yàn)檎叫蔚膶捄透呤窍嗟鹊?。所以我們需要重寫setWidth()和setHeight()方法,這可能暗示著在這兒并不適合使用繼承。

下面是Square類:

Java代碼
  1. // A Square class.   
  2. public class Square extends Rectangle {   
  3.   public Square(double s) {super(s, s);}   
  4.   public void setWidth(double w) {   
  5.     super.setWidth(w);   
  6.     super.setHeight(w);   
  7.   }   
  8.   public void setHeight(double h) {   
  9.     super.setHeight(h);   
  10.     super.setWidth(h);   
  11.   }   
  12. }  

 

一切看上去都很好,但是注意下面的代碼:

Java代碼
  1. public class TestRectangle {   
  2.     // Define a method that takes a Rectangle reference.   
  3.     public static void testLSP(Rectangle r) {   
  4.     r.setWidth(4.0);   
  5.     r.setHeight(5.0);   
  6.     System.out.println("Width is 4.0 and Height is 5.0" +   
  7.     ", so Area is " + r.area());   
  8.     if (r.area() == 20.0)   
  9.     System.out.println("Looking good!\n");   
  10.     else  
  11.     System.out.println("Huh?? What kind of rectangle is   
  12.     this??\n");   
  13.     }   
  14.   
  15.     public static void main(String args[]) {   
  16.         // Create a Rectangle and a Square   
  17.         Rectangle r = new Rectangle(1.01.0);   
  18.         Square s = new Square(1.0);   
  19.         // Now call the method above. According to the   
  20.         // LSP, it should work for either Rectangles or   
  21.         // Squares. Does it??   
  22.         testLSP(r);   
  23.         testLSP(s);   
  24.     }   
  25. }  

 

測(cè)試程序輸出:

Java代碼
  1. Width is 4.0 and Height is 5.0, so Area is 20.0  
  2. Looking good!   
  3. Width is 4.0 and Height is 5.0, so Area is 25.0  
  4. Huh?? What kind of rectangle is this??  

 

看起來(lái)我們違反了里氏代換原則,問(wèn)題在哪兒?testLSP()方法合理的假設(shè)當(dāng)一個(gè)矩形的寬改變時(shí),它的高度不變。當(dāng)傳遞一個(gè)正方形對(duì)象時(shí),該方法卻違反了里氏代換原則。從數(shù)學(xué)上看,正方形是一個(gè)矩形,但是一個(gè)正方形對(duì)象卻不是矩形對(duì)象,因?yàn)橐粋€(gè)正方形對(duì)象的行為和一個(gè)矩形對(duì)象的行為不一致。從行為上來(lái)說(shuō),正方形不是矩形!里氏代換原則清晰的說(shuō)明,IS-A關(guān)系是對(duì)于所有的行為來(lái)說(shuō)的,為了遵循里氏代換原則,子類的行為必須和客戶端使用的基類的行為一致。

子類不能比基類具有更多的約束,因?yàn)楸仨氃谌魏慰梢允褂没惖牡胤绞褂米宇悾绻宇惐然愑懈嗟募s束,那么就會(huì)出現(xiàn)基類可用,但卻違反了子類約束的情況。

 

總結(jié)

里氏代換原則是對(duì)開(kāi)閉原則的擴(kuò)展,它表明我們?cè)趧?chuàng)建基類的新的子類時(shí),不應(yīng)該改變基類的行為。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++ 接口(抽象類)
C#設(shè)計(jì)模式(2) -呂
設(shè)計(jì)模式 - 七大設(shè)計(jì)原則(三)- 迪米特法則與里氏替換原則
我對(duì)Java Serializable(序列化)的理解和總結(jié)
面向?qū)ο蟮囊苫?,java設(shè)計(jì)正方形,長(zhǎng)方形
重溫面向?qū)ο蠛诵?上
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服