在物件導向程式設計中,solid是五個設計原則的首字母縮寫,旨在使軟體設計更易於理解、靈活和可維護。這些原則是由美國軟體工程師和講師羅伯特·c·馬丁(robert cecil martin)提出的許多原則的子集,在他2023年的**《設計原則與設計模式》中首次提出。
solid 原則包含:
本文我們來介紹黎克特制替換原則。
在物件導向的程式設計中,黎克特制替換原則(liskov substitution principle)是對子型別的特別定義。它由芭芭拉·利斯科夫(barbara liskov)在2023年的一次會議上,在名為「資料的抽象與層次」的演說中首次提出。
黎克特制替換原則的內容可以描述為:「派生類(子類)物件可以在程式中代替其基類(超類)物件。」
也就是說,程式中的物件不管出現在什麼地方,都應該可以使用其派生類(子類)的物件進行替換,而不影響程式執行的正確性。
我們看這樣乙個示例,假設乙個企業有三種員工,一種是拿鐵飯碗的永久雇員,一種是合同工,一種是臨時工。我們設計幾個類來表示這三種員工。
先定義乙個 employee 基類。
public abstract class employee
/// /// 計算獎金
///
///
public abstract decimal calculatebonus();
}
再定義該基類的三個子類:
/// /// 永久雇員
///
public class permanentemployee : employee
}/// /// 合同工
///
public class contractemployee : employee
}/// /// 臨時工(臨時工沒有獎金)
///
public class temporaryemployee : employee
}
接下來在main
方法中呼叫它們。
先定義乙個型別為基類 employee 的變數e
,再分別使用其子類 permanentemployee、contractemployee 和 temporaryemployee 建立物件賦值給基類變數e
,然後呼叫e
的calculatebonus()
方法。
static void main(string args)
; console.writeline($" 的年終獎是 元");
e = new contractemployee() ;
console.writeline($" 的年終獎是 元");
e = new temporaryemployee() ;
console.writeline($" 的年終獎是 元");
}
執行一下可以觀察到(顯而易見的),當使用 permanentemployee 和 contractemployee 類建立的物件替換基型別 employee 的變數e
時,呼叫calculatebonus()
方法可以正常執行,但是使用 temporaryemployee 類建立的物件替換變數e
時,呼叫calculatebonus()
方法丟擲了異常,導致程式無法正常執行。這就明顯違反了黎克特制替換原則。
那麼,應該如何改進一下呢?
我們看到,每種員工都有基本資訊name
屬性,但是由於臨時工 temporaryemployee 沒有獎金,所以不需要計算獎金。因此我們應該把計算獎金的方法calculatebonus
單獨抽象出去,而不是讓它們都繼承於同乙個基類,並將 temporaryemployee 子類中的calculatebonus
方法丟擲乙個異常。
改進後的**:
inte***ce iemployee
public abstract class employee
}/// /// 永久雇員
///
public class permanentemployee : employee, iemployee
}/// /// 合同工
///
public class contractemployee : employee, iemployee
}/// /// 臨時工
///
public class temporaryemployee : employee
在main
方法中,將呼叫它們的測試**改為:
static void main(string args)
; e = p;
ie = p;
console.writeline($" 的年終獎是 元");
var c = new contractemployee() ;
e = c;
ie = c;
console.writeline($" 的年終獎是 元");
e = new temporaryemployee() ;
console.writeline($" 是臨時工,無年終獎。");
}
程式執行正常。
這樣,這些子類的設計便遵循了黎克特制替換原則。
本文我介紹了 solid 原則中的黎克特制替換原則(liskov substitution principle),並通過 c# **示例簡明地詮釋了它的含意和實現,希望對您有所幫助。
作者 : 技術譯民出品 : 技術譯站
C 例項解釋物件導向程式設計中的開閉原則
在物件導向程式設計中,solid是五個設計原則的首字母縮寫,旨在使軟體設計更易於理解 靈活和可維護。這些原則是由美國軟體工程師和講師羅伯特 c 馬丁 robert cecil martin 提出的許多原則的子集,在他2000年的 設計原則與設計模式 中首次提出。solid 原則包含 本文我們來介紹開...
C 中的物件導向程式設計
繼承密封類 子類的初始化順序 多型所有類的父類systemobject c 中的物件導向程式設計是指3個基本特徵 封裝 繼承 多型。當類的內部資料沒有被封裝時,若把字段定義為公共字段,則外部物件可以對內部資料進行任意的操作,很可能導致不當的操作結果。例如 public class person cl...
C 中的物件導向程式設計
所有的物件導向語言都具有3個基本特徵,c 也是不例外的。1 封裝 封裝指的是把類內部的資料隱藏起來,不讓物件例項直接對其操作。在c 中,封裝可以通過public private protected和internal等關鍵字來體現。c 對保護內部資料狀態提供了一種方式,叫做屬性機制。public cl...