大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面向對象設計原則

里氏替換原則

在上一節《開閉原則——面向對象設計原則》中,我們詳細介紹了開閉原則,本節我們來介紹里式替換原則。

里氏替換原則的定義

里氏替換原則(Liskov Substitution Principle,LSP)由麻省理工學院計算機科學實驗室的里斯科夫(Liskov)女士在 1987 年的“面向對象技術的高峰會議”(OOPSLA)上發表的一篇文章《數據抽象和層次》(Data Abstraction and Hierarchy)里提出來的,她提出:繼承必須確保超類所擁有的性質在子類中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。

里氏替換原則主要闡述了有關繼承的一些原則,也就是什么時候應該使用繼承,什么時候不應該使用繼承,以及其中蘊含的原理。里氏替換原是繼承復用的基礎,它反映了基類與子類之間的關系,是對開閉原則的補充,是對實現抽象化的具體步驟的規范。

里氏替換原則的作用

里氏替換原則的主要作用如下。

1、里氏替換原則是實現開閉原則的重要方式之一。

2、它克服了繼承中重寫父類造成的可復用性變差的缺點。

3、它是動作正確性的保證。即類的擴展不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性。

里氏替換原則的實現方法

里氏替換原則通俗來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。也就是說:子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法。

如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多態比較頻繁時,程序運行出錯的概率會非常大。

如果程序違背了里氏替換原則,則繼承類的對象在基類出現的地方會出現運行錯誤。這時其修正方法是:取消原來的繼承關系,重新設計它們之間的關系。

關于里氏替換原則的例子,最有名的是“正方形不是長方形”。當然,生活中也有很多類似的例子,例如,企鵝、鴕鳥和幾維鳥從生物學的角度來劃分,它們屬于鳥類;但從類的繼承關系來看,由于它們不能繼承“鳥”會飛的功能,所以它們不能定義成“鳥”的子類。同樣,由于“氣球魚”不會游泳,所以不能定義成“魚”的子類;“玩具炮”炸不了敵人,所以不能定義成“炮”的子類等。

下面以“幾維鳥不是鳥”為例來說明里氏替換原則。

【例2】里氏替換原則在“幾維鳥不是鳥”實例中的應用。

分析:鳥一般都會飛行,如燕子的飛行速度大概是每小時 120 千米。但是新西蘭的幾維鳥由于翅膀退化無法飛行。假如要設計一個實例,計算這兩種鳥飛行 300 千米要花費的時間。顯然,拿燕子來測試這段代碼,結果正確,能計算出所需要的時間;但拿幾維鳥來測試,結果會發生“除零異常”或是“無窮大”,明顯不符合預期,其類圖如圖 1 所示。

圖1 “幾維鳥不是鳥”實例的類圖

程序代碼如下:

package principle;
public class LSPtest
{
    public static void main(String[] args)
    {
        Bird bird1=new Swallow();
        Bird bird2=new BrownKiwi();
        bird1.setSpeed(120);
        bird2.setSpeed(120);
        System.out.println("如果飛行300公里:");
        try
        {
            System.out.println("燕子將飛行"+bird1.getFlyTime(300)+"小時.");
            System.out.println("幾維鳥將飛行"+bird2.getFlyTime(300)+"小時。");
        }
        catch(Exception err)
        {
            System.out.println("發生錯誤了!");
        }
    }
}
//鳥類
class Bird
{
    double flySpeed;
    public void setSpeed(double speed)
    {
        flySpeed=speed;
    }
    public double getFlyTime(double distance)
    {
        return(distance/flySpeed);
    }
}
//燕子類
class Swallow extends Bird{}
//幾維鳥類
class BrownKiwi extends Bird
{
    public void setSpeed(double speed)
    {
           flySpeed=0;
    }
}

程序的運行結果如下:

如果飛行300公里:
燕子將飛行2.5小時.
幾維鳥將飛行Infinity小時。

程序運行錯誤的原因是:幾維鳥類重寫了鳥類的 setSpeed(double speed) 方法,這違背了里氏替換原則。正確的做法是:取消幾維鳥原來的繼承關系,定義鳥和幾維鳥的更一般的父類,如動物類,它們都有奔跑的能力。幾維鳥的飛行速度雖然為 0,但奔跑速度不為 0,可以計算出其奔跑 300 千米所要花費的時間。其類圖如圖 2 所示。

圖2 “幾維鳥是動物”實例的類圖

全部教程
主站蜘蛛池模板: 国产精品一区二区久久沈樵 | 中文国产成人精品久久一区 | 日日噜噜噜夜夜爽爽狠狠69 | 九九热精品视频在线播放 | 欧美特欧美特级一片 | h视频在线观看免费网站 | 亚洲国产精品乱码在线观看97 | 亚洲一区 中文字幕 | 精品久久久久久中文字幕女 | 天天拍天天干 | 日日噜噜噜夜夜爽爽狠狠 | 国产综合精品 | 一级毛片免费网站 | 久久亚洲国产成人影院 | 特级理论片 | 亚洲精品一 | 99香蕉国产精品偷在线观看 | 嫩小xxxxx性bbbbb孕妇 | 2021国产精品自产拍在线 | 欧美大尺度 边吃奶边做 | 中国妞xxx的视频 | 国内精品伊人久久久影视 | 香蕉视频在线观看黄 | 亚州一级 | 国产成人精品一区二区不卡 | 欧美一级片在线视频 | 国产一区国产二区国产三区 | 亚洲人成自拍网站在线观看忄 | 五月久久婷婷综合片丁香花 | 精品日韩一区二区三区视频 | 国产欧美日韩看片片在线人成 | 成人a一级毛片免费看 | 日韩精品一区二区三区中文在线 | 中文字幕免费在线 | 99热这里只有精品4 99热这里只有精品5 | 欧美aa一级 | 欧美一级高清在线观看 | 国产一级特黄特色aa毛片 | www久久| 免费国产一区二区三区四区 | 免费人成激情视频在线观看冫 |