.NET Core CSharp初級篇 1-6
全文目錄
本節內容為類的多型與繼承
簡介
終於講到了物件導向三大特性中的兩大特性——繼承與多型。透過繼承與多型,我們能很好的將類的擴充性發揮到了極致。在下面的內容講解中,我們將從各個方面對繼承和多型進行刨析。
繼承
繼承事實上是一個非常好理解的語法,在C#中實現繼承使用A:B,表示A類繼承B類。子類(一稱為派生類)繼承於父類(一稱為基類)就好比孩子繼承了父親的一切,但是孩子總歸是有自己的個性的,而父親也有一些不會告訴孩子的事情。如果我們從之前的訪問控制符這一部分進行理解的話,你可以這樣描述這個“融洽”的父子關係。
假定有以下這個例子:塞巴斯蒂安·艾奎斯(父類)是一個歐洲宮廷的貴族,67歲,他是一個子爵,並且掌握了一個驚天大秘密不能告訴任何人,只能爛在肚子裡。他育有一子名叫麥克·艾奎斯,由於塞巴斯蒂安·艾奎斯年老體弱,當家裡需要錢的時候,他會讓自己的兒子帶上銀行卡前往atm機取錢。兒子的車和他的車一模一樣,每次兒子讓管家開車的時候都必須說清楚:“我要開我父親的車。”,或者:“今天我開我自己的車”。如果他沒有說,那麼管家會預設的取出兒子的車。他家還有一個大莊園閒置可以用於開發,只要父親同意,那麼兒子可以自由開發。
對於這個例子,你需要得出的結論是:
- 如果塞巴斯蒂安·艾奎斯(父類)沒有出生,那麼麥克·艾奎斯(子類)也不存在。(子類例項化時必定先呼叫父類構造方法)
- 對於塞巴斯蒂安·艾奎斯(父類),他的名字屬於大家都可以知道的(public),誰都可以輕易的得到。但是想擁有這個名字,卻只能是他的家族的人才可以(繼承後才能獲得父類的欄位)。
- 對於前往ATM機取錢這件事,取款密碼只可能告訴他的兒子,別人是不能得到的。(protected可以被子類訪問,但是其餘不可訪問)
- 塞巴斯蒂安·艾奎斯(父類)知道一個秘密,這個秘密只有他本人才知道(private),包括他的兒子也不可能知曉(子類無法獲取private)
- 因為父子倆的車一模一樣,取車需要特別說明(子類和父類函式簽名一致時,父類函式預設會隱藏,除非顯式的說明)
- 大莊園是父親的,但是可以被兒子取改造(父類函式指定為virtual時,子類可以重寫父類函式)
透過這一些刨析,我認為你應該已經清楚了七八分繼承的意思了。這裡需要介紹一下我們的base關鍵字,base關鍵字在子類中體現為呼叫父類的方法。
特別的,你需要注意的是,C#對於類與類的繼承只支援單繼承,如果你試圖實現多繼承,你可以使用介面作為媒介和橋樑。
我們現在用一段程式碼演示完我們的繼承,我們這個教程更多的是引導你去思考,而不是讓你如同一些速成培訓班出來的一樣,沒有獨立的思考能力。
class Father
{
public Father()
{
Console.WriteLine("Father Method");
}
private string MSGSecret;
protected string BankSecret;
public string Name;
public string Car;
protected void test()
{
}
}
class Son:Father
{
public Son()
{
Console.WriteLine("Son Method");
}
//隱式的生成了這三個欄位
//protected string BankSecret;
//public string Name;
//public string Car;
public string Car;
public void getCar()
{
base.Car;//父類
this.Car;//子類
base.test()//呼叫父類方法,如果簽名不衝突,可以省略base
}
}
Son s = new Son();//思考一下這裡會輸出什麼?
多型
多型是一個並不困難的東西,在繼承和介面中我們講到的重寫其實就是多型性的一種型別了。之前我們簡單的舉過一個例子來說明多型:人和鯉魚都是動物,但是人用肺進行呼吸,而鯉魚用鰓進行呼吸。這個例子就很好的體現了多型。利用下面這段程式碼來解釋吧。
class Animal
{
//透過抽象方法實現多型
abstract void Breathing();
//虛方法實現多型
virtual void Eat()
{
}
}
class Human:Animal
{
override void Breathing()
{
}
override void Eat()
{
}
}
class Fish:Animal
{
override void Breathing()
{
}
new void Eat()
{
}
}
Animal ah = new Human();
Animal af = new Fish();
Fish f = new Fish();
注意看最後幾行,ah和af各屬於Human和Fish的物件,但是當方法呼叫的時候,統一呼叫父類中的方法,並且載入子類中的重寫和實現。
ah.Eat();//呼叫父類的Eat(),但是以Human類中的重寫方法為實現
af.Eat();
f.Eat();
這三者的區別在哪裡?事實上你只需要知道,多型性就是透過父類去管理子類,讓子類遵循父類的規範。當子類使用從父類繼承的方法的時候,是去呼叫父類的方法,但是使用子類的實現。特別的,如果你在方法中使用new修飾符,那麼這個方法將會和父類毫無關係,就如這個單詞的意思一樣,這是一個新的函式,不是父類中的函式。現在你可以試著分析上述三個函式呼叫的各是哪個類中的方法。
多型最大的有點就是你可以透過一個基類或者介面去管理所有繼承於他們的子類的函式方法,並且同一個函式可以有多種實現方法。
如果你使用介面和抽象類去實現多型,實現的方法也是一樣的,只不過是基型別無法例項化。
作 者:WarrenRyan
出 處:https://www.cnblogs.com/WarrenRyan/
關於作者:熱愛數學、熱愛機器學習,喜歡彈鋼琴的不知名小菜雞。
版權宣告:本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。若需商用,則必須聯絡作者獲得授權。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
博主一些其他平臺:
微信公眾號:寤言不寐
BiBili——小陳的學習記錄
Github——StevenEco
BiBili——記錄學習的小陳(計算機考研紀實)
掘金——小陳的學習記錄
知乎——小陳的學習記錄
聯絡方式:
電子郵件:cxtionch@live.com社交媒體聯絡二維碼: