05黎克特制替換原則

2021-09-25 01:22:25 字數 1109 閱讀 9647

繼承在程式設計中帶來了便利,也帶來了弊端。比如使用繼承會給程式帶來侵入性,程式的可移植性降低,增加物件之間的耦合性。如果乙個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,並且父類修改後,所涉及到子類的功能都有可能產生故障。

如何正確的使用繼承?

答案是黎克特制替換原則:

1、引用基類的地方必須透明的使用其子類物件。

2、 在使用繼承時,遵循黎克特制替換原則,在子類中盡量不要重寫父類的方法。

3、繼承實際上讓兩個類的耦合性增強了,在適當的情況下,可以通過聚合,組合,依賴來解決問題。

public class substitution01 

}class a

}// 增加了乙個新功能,但無意中重寫了func1;

class b extends a

public int func2(int a, int b)

}

執行結果:

10 - 3 = 7

10 - 3 = 13

10 - 3 + 1 = 14

我們發現原來執行正常的相減功能發生了錯誤,原因是我們的子類b無意中重寫了父類的關係,造成原有功能的錯誤。在實際程式設計中,我們常常會通過重寫父類的方法完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的複雜性會比較差。特別是執行多型比較頻繁的時候。

解決方法:

原來父類和子類都繼承乙個更通俗的基類,原有的繼承關係去掉,採用依賴,聚合,組合等的關係替代。

public class substitution02 

}class base

class a2 extends base

}class b2 extends base

public int func2(int a, int b)

// 我們仍然想用a類的方法

public int func3(int a, int b)

}

輸出結果:

10 - 3 = 7

10 + 3 = 13

10 + 3 + 1 = 14

10 - 3 = 7

2 黎克特制替換原則

肯定有不少人跟我剛看到這項原則的時候一樣,對這個原則的名字充滿疑惑。其實原因就是這項原則最早是在1988年,由麻省理工學院的一位姓裡的女士 barbara liskov 提出來的。如果對每乙個型別為 t1的物件 o1,都有型別為 t2 的物件o2,使得以 t1定義的所有程式 p 在所有的物件 o1 ...

設計原則2 黎克特制替換原則

1.通俗來說,子類可以擴充套件父類的功能,但是不能改變父類原有的功能。2.在程式中將乙個父類物件替換成子類物件,程式將不會產生任何錯誤和異常,反過來不成立。3.它是實現開閉原則的重要方式之一,由於使用基類物件的地方都可以使用子類物件,程式中盡量使用父類型別來定義物件,執行時再確立子類型別,用子類物件...

02 黎克特制替換原則 LSP

lsp liskov substitution principle 黎克特制替換原則 所有引用基類 父類 的地方必須能透明地使用其子類的物件。通俗講 子類可以擴充套件父類的功能,但不能改變父類原有的功能 是實現開閉原則的重要方式之一 克服了繼承中重寫父類造成的可用性變差的缺點 它是動作正確性的保證。...