c 基礎 繼承 11 黎克特制替換原則

2021-10-13 17:13:47 字數 1887 閱讀 8477

c#中只能單繼承。

概念:父類容器裝子類物件

作用:方便對子類物件的管理

使用:1.is 判斷乙個物件是否是指定類物件,是返回true,不是返回false

2.as 將乙個物件轉化為指定類物件

例子:

class

gameobject

class

animal

: gameobject

}class

tree

: gameobject

}class

school

: gameobject

}class

person

;for

(int i=

0;i)else

if(gameobjects[i] is tree)

else

if(gameobjects[i] is school)

} console.

readkey()

;}}

注意:不能用子類物件裝父類

補:上面只是lsp原則的用法,但沒有體現出具體的好處

lsp原則:乙個程式中如果使用的是乙個父類,那麼該程式一定適用於其子類,而且程式察覺不出父類和子類物件的區別。也就是說在程式中,把父類替換成它的子類,程式的行為沒有任何變化。

黎克特制替換原則包含以下4層含義:

子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。

子類中可以增加自己特有的方法。

當子類覆蓋或實現父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。

當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格

當父類裡的抽象方法或則virtual虛方法的一些行為,子類如果不具有這些行為時,請不要繼承該父類,否則就會造成修改父類方法的原有功能而違法lsp原則,設計類與類之間要不要繼承的原則,繼承了子類再去重寫裡面的方法

通過下面兩個反例說明:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace @override

class

sparrow

:birds

}class

penguin

:birds

}class

program

static

void

main

(string

args)

}}

penguin企鵝類不要繼承birds鳥類,實際上,這裡penguin企鵝就是強行繼承birds鳥類,雖然現實中企鵝也是鳥,但在**中卻不行。

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace @override

}class

animal

:gameobject

}class

person

}}

如果使用了繼承,子類重寫了父類方法(抽象方法除外),就會違背黎克特制替換原則,會讓程式增加出錯的可能

總結一下黎克特制替換原則的特點,就是子類可以拓展父類的功能,但是不能改變父類原有的功能。子類可以重寫父類的抽象方法,但不能覆蓋父類的非抽象方法。子類可以增加自己獨有的方法

2 黎克特制替換原則

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

05黎克特制替換原則

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

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

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