.NET Core CSharp初級篇 1-6 類的多態與繼承

.NET Core CSharp初級篇 1-6

本節內容爲類的多態與繼承git

簡介

終於講到了面向對象三大特性中的兩大特性——繼承與多態。經過繼承與多態,咱們能很好的將類的拓展性發揮到了極致。在下面的內容講解中,咱們將從各個方面對繼承和多態進行刨析。github

繼承

繼承事實上是一個很是好理解的語法,在C#中實現繼承使用A:B,表示A類繼承B類。子類(一稱爲派生類)繼承於父類(一稱爲基類)就比如孩子繼承了父親的一切,可是孩子總歸是有本身的個性的,而父親也有一些不會告訴孩子的事情。若是咱們從以前的訪問控制符這一部分進行理解的話,你能夠這樣描述這個「融洽」的父子關係。ide

假定有如下這個例子:塞巴斯蒂安·艾奎斯(父類)是一個歐洲宮廷的貴族,67歲,他是一個子爵,而且掌握了一個驚天大祕密不能告訴任何人,只能爛在肚子裏。他育有一子名叫麥克·艾奎斯,因爲塞巴斯蒂安·艾奎斯年老體弱,當家裏須要錢的時候,他會讓本身的兒子帶上銀行卡前往atm機取錢。兒子的車和他的車如出一轍,每次兒子讓管家開車的時候都必須說清楚:「我要開我父親的車。」,或者:「今天我開我本身的車」。若是他沒有說,那麼管家會默認的取出兒子的車。他家還有一個大莊園閒置能夠用於開發,只要父親贊成,那麼兒子能夠自由開發。函數

對於這個例子,你須要得出的結論是:ui

  • 若是塞巴斯蒂安·艾奎斯(父類)沒有出生,那麼麥克·艾奎斯(子類)也不存在。(子類實例化時一定先調用父類構造方法)
  • 對於塞巴斯蒂安·艾奎斯(父類),他的名字屬於你們均可以知道的(public),誰均可以輕易的獲得。可是想擁有這個名字,卻只能是他的家族的人才能夠(繼承後才能得到父類的字段)。
  • 對於前往ATM機取錢這件事,取款密碼只可能告訴他的兒子,別人是不能獲得的。(protected能夠被子類訪問,可是其他不可訪問)
  • 塞巴斯蒂安·艾奎斯(父類)知道一個祕密,這個祕密只有他本人才知道(private),包括他的兒子也不可能知曉(子類沒法獲取private)
  • 由於父子倆的車如出一轍,取車須要特別說明(子類和父類函數簽名一致時,父類函數默認會隱藏,除非顯式的說明)
  • 大莊園是父親的,可是能夠被兒子取改造(父類函數指定爲virtual時,子類能夠重寫父類函數)

經過這一些刨析,我認爲你應該已經清楚了七八分繼承的意思了。這裏須要介紹一下咱們的base關鍵字,base關鍵字在子類中體現爲調用父類的方法。this

特別的,你須要注意的是,C#對於類與類的繼承只支持單繼承,若是你試圖實現多繼承,你可使用接口做爲媒介和橋樑。spa

咱們如今用一段代碼演示完咱們的繼承,咱們這個教程更多的是引導你去思考,而不是讓你如同一些速成培訓班出來的同樣,沒有獨立的思考能力。code

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的對象,可是當方法調用的時候,統一調用父類中的方法,而且加載子類中的重寫和實現。blog

ah.Eat();//調用父類的Eat(),可是以Human類中的重寫方法爲實現
af.Eat();
f.Eat();

這三者的區別在哪裏?事實上你只須要知道,多態性就是經過父類去管理子類,讓子類遵循父類的規範。當子類使用從父類繼承的方法的時候,是去調用父類的方法,可是使用子類的實現。特別的,若是你在方法中使用new修飾符,那麼這個方法將會和父類毫無關係,就如這個單詞的意思同樣,這是一個新的函數,不是父類中的函數。如今你能夠試着分析上述三個函數調用的各是哪一個類中的方法。

多態最大的有點就是你能夠經過一個基類或者接口去管理全部繼承於他們的子類的函數方法,而且同一個函數能夠有多種實現方法。

若是你使用接口和抽象類去實現多態,實現的方法也是同樣的,只不過是基類型沒法實例化。

Github

BiliBili主頁

WarrenRyan's Blog

博客園

相關文章
相關標籤/搜索