iT邦幫忙

DAY 11
4

軟體路上不孤單,給我SSD,學習之路狂飆系列 第 11

軟體路上不孤單Day11-物件導向原則介紹4[LSP]

今天要介紹的是LSP(Liskov Substitution Principle)Liskov替換原則!
前幾天介紹了OCP(開放/封閉原則)、DRY(不要重複你自己)、SRP(單一責任原則)三個原則,有沒有發現這些原則都有個相同點:就是讓軟體更好維護,使用起來更不容易用錯。今天要介紹的也是有相同的味道,Liskov替換原則(LSP)。

這個原則不向前面三個一樣,可以聯想到這個原則是在做什麼的。其實我也不知道Liskov是誰啊~不過這個原則主要要表達的也是責任分類歸屬。

Liskov替換原則的定義是:『子類別必須能夠替代基礎類別』

也就是說不要繼承不必要的遺產,沒用到而去繼承反而是種累贅甚至會搞壞了整個系統也不一定。

來看以下這個有趣的範例:

class 鳥類 {
    public void 飛行() {
        Console.WriteLine("飛呀飛喔~~");
    }
    public void 吃() {
        Console.WriteLine("好吃好吃~~");
    }
}

class 烏鴉 : 鳥類 { }

class 鴕鳥 : 鳥類 {
    public void 飛行(){
        throw new NotSupportedException();
    }
}

結果當我執行他時:

static void 讓鳥去飛吧(List<鳥類> 一群鳥) {
    foreach (var 一隻鳥 in 一群鳥) {
        一隻鳥.飛行();
    }
}

static void Main(string[] args) {
    List<鳥類> 一群鳥 = new List<鳥類>();
    一群鳥.Add(new 烏鴉());
    一群鳥.Add(new 鴕鳥());
    一群鳥.Add(new 鳥類());
    讓鳥去飛吧(一群鳥);
}

結果是:

有發現嗎?不能飛的,現在能飛了,不能吃的,現在也能吃了!是不是很無言呢?那是因為子類別無法替代基礎類別的所早成的,也就是違反了Liskov替換原則。其實這種情況不應該用繼承的,應該把飛行跟吃拉出來用介面然後再讓不同的鳥類去實做。關於這點,下次在跟大家介紹吧!

文章導覽
全系列
上一篇
下一篇


上一篇
軟體路上不孤單Day10-物件導向原則介紹3[SRP]
下一篇
軟體路上不孤單Day12-物件導向原則介紹5[ISP]
系列文
軟體路上不孤單,給我SSD,學習之路狂飆31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-04 22:49:51

pajace2001提到:
不能飛的,現在能飛了,不能吃的,現在也能吃了!

這鳥好厲害哦,叫它們去飛,它們竟敢“又飛又吃”?無言

沙發

我要留言

立即登入留言