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.它是實現開閉原則的重要方式之一,由於使用基類物件的地方都可以使用子類物件,程式中盡量使用父類型別來定義物件,執行時再確立子類型別,用子類物件...