設計模式之里氏替換原則

設計模式之里氏替換原則

里氏替換原則(LSP: Liskov Substitution Principle)

定義:####:

  1. 子類可以擴展父類的功能,但不能改變父類的原有功能
  • 子類可以繼承父類琅绅,但是不能覆蓋父類的非抽象方法
  1. 程序中將任意一個基類對象替換成子類對象痘系,程序不會產(chǎn)生任何異常挡爵。反過來則不成立。
  • 每一個使用基類的地方,都可以透明的使用子類對象
  1. 里氏代換原則是實現(xiàn)開閉原則的重要方式之一,由于使用基類對象的地方都可以使用子類對象魏割,因此在程序中盡量使用基類類型來對對象進行定義,而在運行時再確定其子類類型钢颂,用子類對象來替換父類對象钞它。
  • OOP多態(tài)的使用
    public class People
    {
        public void SayHIStandard()
        {
            Console.WriteLine("普通話:你好");
        }
    }

    public class HubeiPeople : People
    {
        public new void SayHIStandard()  //破壞父類的標準,覆蓋了父類的方法
        {
            Console.WriteLine("湖北話:你好");
        }
    }

    public class SichuanPeople : People
    {
        public new void SayHIStandard() //破壞父類的標準殊鞭,覆蓋了父類的方法
        {
            Console.WriteLine("四川話:你好");
        }
    }

    People people = new People();
    people.SayHIStandard();  
    HubeiPeople hbPeople = new HubeiPeople();    
    people.SayHIStandard();    //并非父類定義的標準遭垛,覆蓋了父類的方法
    SichuanPeople scPeople = new SichuanPeople();
    people.SayHIStandard();    //并非父類定義的標準,覆蓋了父類的方法

上述代碼操灿,明顯違反了里氏替換原則锯仪,子類覆蓋了父類的非抽象方法,那么當程序所有使用基類的地方牲尺,換上子類的實例卵酪,也將改變原程序的結果幌蚊。根據(jù)里氏替換原則谤碳,我們更新代碼如下:

    public abstract class People
    {
        public void SayHIStandard()
        {
            Console.WriteLine("普通話:你好");
        }

        public abstract void SayHICustom();
    }

    public class HubeiPeople : People
    {
        public override void SayHICustom()
        {
            Console.WriteLine("湖北話:你好");
        }
    }

    public class SichuanPeople : People
    {
        public override void SayHICustom() 
        {
            Console.WriteLine("四川話:你好");
        }
    }

    People hbPeople = new HubeiPeople();
    hbPeople.SayHIStandard();   
    hbPeople.SayHICustom();

    People scPeople = new SichuanPeople();
    scPeople.SayHIStandard();
    scPeople.SayHICustom();

按照里氏替換原則更新代碼過后,不僅可以繼續(xù)使用基類的原有標準SayHIStandard()方法溢豆,還可以調用子類擴展的SayHICustom()方法

使用總結:

  1. 盡量聲明的時候用父類蜒简,而不是具體的子類
  2. 子類不要覆蓋父類的方法,如果有需要漩仙,父類的方法應該定義為abstract/virtual搓茬,子類override.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市队他,隨后出現(xiàn)的幾起案子卷仑,更是在濱河造成了極大的恐慌,老刑警劉巖麸折,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锡凝,死亡現(xiàn)場離奇詭異,居然都是意外死亡垢啼,警方通過查閱死者的電腦和手機窜锯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門张肾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锚扎,你說我怎么就攤上這事吞瞪。” “怎么了驾孔?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵芍秆,是天一觀的道長。 經(jīng)常有香客問我助币,道長浪听,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任眉菱,我火速辦了婚禮迹栓,結果婚禮上,老公的妹妹穿的比我還像新娘俭缓。我一直安慰自己克伊,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布华坦。 她就那樣靜靜地躺著愿吹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惜姐。 梳的紋絲不亂的頭發(fā)上犁跪,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音歹袁,去河邊找鬼坷衍。 笑死,一個胖子當著我的面吹牛条舔,可吹牛的內容都是我干的枫耳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼孟抗,長吁一口氣:“原來是場噩夢啊……” “哼迁杨!你這毒婦竟也來了?” 一聲冷哼從身側響起凄硼,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铅协,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摊沉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狐史,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了预皇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈玄。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吟温,靈堂內的尸體忽然破棺而出序仙,到底是詐尸還是另有隱情,我是刑警寧澤鲁豪,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布潘悼,位于F島的核電站,受9級特大地震影響爬橡,放射性物質發(fā)生泄漏治唤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一糙申、第九天 我趴在偏房一處隱蔽的房頂上張望宾添。 院中可真熱鬧,春花似錦柜裸、人聲如沸缕陕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛邑。三九已至,卻和暖如春铐然,著一層夾襖步出監(jiān)牢的瞬間蔬崩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工搀暑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沥阳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓险掀,卻偏偏與公主長得像沪袭,于是被迫代替她去往敵國和親湾宙。 傳聞我的和親對象是個殘疾皇子樟氢,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容