C 例項解釋物件導向程式設計中的黎克特制替換原則

2022-09-23 15:45:08 字數 2995 閱讀 8471

在物件導向程式設計中,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,然後呼叫ecalculatebonus()方法。

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...