日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

深入浅出设计模式原则之里氏代换原则(Liskov Substitution Principle)

發布時間:2024/9/27 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出设计模式原则之里氏代换原则(Liskov Substitution Principle) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面以“幾維鳥不是鳥”為例來說明里氏替換原則(程序源碼)。

#include <QCoreApplication> #include <iostream>/*!* \brief 鳥類*/ class Bird{ public:double _fly_speed;void SetSpeed(double speed){_fly_speed = speed;}double GetFlyTime(double distance){return (distance/_fly_speed);} };/*!* \brief 燕子類*/ class Swallow:public Bird{};/*!* \brief 幾維鳥類*/ class BrownKiwi:public Bird{ public:void SetSpeed(double speed){_fly_speed = 0;} };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Swallow *bird1 = new Swallow;bird1->SetSpeed(120);std::cout<<bird1->_fly_speed<<std::endl;std::cout<<bird1->GetFlyTime(300)<<std::endl;BrownKiwi *bird2 = new BrownKiwi;bird2->SetSpeed(120);std::cout<<bird2->_fly_speed<<std::endl;std::cout<<bird2->GetFlyTime(300)<<std::endl;return a.exec(); }

運行結果:

120 2.5 0 inf

?

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


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

?程序運行錯誤的原因是:幾維鳥類重寫了鳥類的 setSpeed(double speed) 方法,這違背了里氏替換原則。

解決方法:

取消幾維鳥原來的繼承關系,定義鳥和幾維鳥的更一般的父類,如動物類,它們都有奔跑的能力。幾維鳥的飛行速度雖然為 0,但奔跑速度不為 0,可以計算出其奔跑 300 千米所要花費的時間。其類圖如圖 2 所示。

#include <QCoreApplication> #include <iostream>/*!* \brief 動物類*/ class Animal{ public:double _run_speed;void SetRunSpeed(double speed){_run_speed = speed;}double GetRunTime(double distance){return (distance/_run_speed);} };/*!* \brief 鳥類*/ class Bird:public Animal{ public:double _fly_speed;void SetSpeed(double speed){_fly_speed = speed;}double GetFlyTime(double distance){return (distance/_fly_speed);} };/*!* \brief 燕子類*/ class Swallow:public Bird{};/*!* \brief 幾維鳥類*/ class BrownKiwi:public Animal{};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Swallow *bird1 = new Swallow;bird1->SetSpeed(120);std::cout<<bird1->_fly_speed<<std::endl;std::cout<<bird1->GetFlyTime(300)<<std::endl;BrownKiwi *bird2 = new BrownKiwi;bird2->SetRunSpeed(120);std::cout<<bird2->_run_speed<<std::endl;std::cout<<bird2->GetRunTime(300)<<std::endl;return a.exec(); }

?運行結果:

120 2.5 120 2.5

?

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

根據上述理解,對里氏替換原則的定義可以總結如下:

  • 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法
  • 子類中可以增加自己特有的方法
  • 當子類的方法重載父類的方法時,方法的前置條件(即方法的輸入參數)要比父類的方法更寬松
  • 當子類的方法實現父類的方法時(重寫/重載或實現抽象方法),方法的后置條件(即方法的的輸出/返回值)要比父類的方法更嚴格或相等

參考

  • 設計模式六大原則(2):里氏替換原則
  • 里氏替換原則——面向對象設計原則
  • ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的深入浅出设计模式原则之里氏代换原则(Liskov Substitution Principle)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。