里氏替換原則
子類的對象能夠替換其父類
父類對象不能夠替換子類
父類的方法都要在子類中實現或者重寫
示例:
List<Persons> listPerson = new List<Persons>();
listPerson.Add(s1);
listPerson.Add(s2);
listPerson.Add(s3);
listPerson.Add(s4);
listPerson.Add(t1);
listPerson.Add(t2);
listPerson.Add(t3);
for (int i = 0; i < listPerson.Count; i++)
{
listPerson[i].SayHi();
}
在Person類中定義了抽象方法SayHi,在Student和Teacher類中分別對SayHi進行了重寫。將他們都放到list集合中時,他們分別具有不同的類型。
監視listPerson[i]結果顯示:
當i=0到3是listPerson[i]的類型是Student
當i=4到6是listPerson[i]的類型是Teacher
這是一個里氏替換的例子,子類會代替父類。
虛方法和抽象方法
抽象方法
方法聲明時加上 abstract 關鍵字,包含抽象方法的類必須是抽象類,因爲抽象方法僅僅只有方法的定義(連大括號{}都沒有),它必須在子類中進行重寫,除非這個子類還是抽象類,由於有這個抽象方法的存在,這個類不能被實例化使用。因而在包含抽象方法的類前也要加上abstract關鍵字。
//抽象方法
public abstract void SayHi();//後面沒有大括號,更沒有裏面的內容!
僅僅是方法的定義,不能包含方法體
必須在子類中重寫override
只能存在於抽象類中
虛方法
方法聲明是加上了virtual關鍵字,與抽象方法不同的是,它提供了一個默認的方法體,其子類可根據自己的需要對其進行重寫。如果不重寫就會調用默認的方法。
public virtual void SayHi()
{
Console.WriteLine("大家好,我是:{0},今年:{1}歲了!",Name ,Age );
}
要有方法體,僅僅一個分號也可以
子類中可以重寫,也可以不重寫
除了不能在密封類中,其他類中都可以
重寫 override
在子類中,如果父類中有抽象方法(abstract)或者虛方法(virtual),可以用override對其進行重寫。
示例:
public override void SayHi()
{
Console.WriteLine("同學們好,我是{0},性別{1},年齡{2},工資{3},教齡{4}。",Name ,Gender ,Age ,Salary ,YearOfService );
}//在Teacher類中對父類Person的SayHi方法重寫
面向對象的三大特性
封裝
隱藏內部實現,穩定外部接口
繼承
子類繼承父類成員,實現代碼複用
多態
不同子類對同一消息做出不同的反映
is 和 as
is
- is用於檢查對象是否與指定類型兼容
檢查一個對象是否兼容於其他指定的類型,並返回一個Bool值,如果一個對象是某個類型或是其父類型的話就返回爲true,否則的話就會返回爲false,永遠不會拋出異常。
如果對象引用爲null,那麼is操作符總是返回爲false,因爲沒有對象可以檢查其類型。
if (person[i] is Student)//判斷Person集合的某元素是不是Student類型
as
- as用於在兼容的引用類型之間指向轉換
必須是引用類型,不能是值類型。