1. 程式人生 > 其它 >學習筆記:C#入門(六)繼承&多型:方法重寫override virtual&abstract虛方法和抽象方法

學習筆記:C#入門(六)繼承&多型:方法重寫override virtual&abstract虛方法和抽象方法

技術標籤:C#&unity 遊戲開發自學c#多型繼承

首先來一段程式碼,看一下繼承的關係

    class Monster
    {
        public void BeHit()
        {
            Console.WriteLine("基類Behit");
        }

    }
    class Slam : Monster
    {
        public void BeHit()
        {
            Console.WriteLine("打史萊姆")
; } } class Mario : Monster { public void BeHit() { Console.WriteLine("打馬里奧"); } } class Program { static void Main(string[] args) { Monster mo = new Monster(); Mario m = new Mario(); Slam s =
new Slam(); mo.BeHit(); m.BeHit(); s.BeHit(); Console.ReadKey(); } }

建立了三個類,其中slam和mario繼承了monster,三個類中有同名函式BeHit();
所以我們知道了第一點
1.子類的方法可以與父類的方法同名
main函式中分別建立了三個類的物件,執行了同名方法
執行結果,果然就是每個類的例項執行各自的方法

基類Behit
打馬里奧
打史萊姆

嘗試一下別的情況

    class Program
{ static void Main(string[] args) { Mario m = new Mario(); m.BeHit(); Monster monster = m; monster.BeHit(); Mario n = (Mario)monster; n.BeHit(); Console.ReadKey(); } }

執行結果

打馬里奧
基類Behit
打馬里奧

首先聲明瞭 Mario m = new Mario();
然後執行,輸出肯定是 打馬里奧 沒有疑問。

然後聲明瞭 Monster monster = m; 沒有報錯
知道了:
2.父類的變數,可以指向子類的物件
此時再monster.BeHit();執行的是父類的方法,輸出 基類Behit
這裡我嘗試將Mario()中的方法改名為BeHit1();然後monster.BeHit1(),系統報錯
在這裡插入圖片描述
那麼雖然monster和m本質是同一個物件,但是monster只能在父類中尋找方法,而m是在子類中尋找方法。

3.某種情況下,強制型別轉換可以將父類物件轉化成子類物件
Mario n = (Mario)monster; 不會報錯,因為monster原本就是Mario型別的m轉化的,輸出 打馬里奧 沒有疑問
Slam p = (Slam)monster;顯示不報錯,執行報錯
在這裡插入圖片描述
Slam p = (Slam)m;顯示紅線報錯
在這裡插入圖片描述

使用virtual和override關鍵字,進行方法的重寫

    class Monster
    {       
        public virtual void BeHit()
        {
            Console.WriteLine("基類Behit");
        }

    }
    class Slam : Monster
    {
        public override void BeHit()
        {
            Console.WriteLine("打史萊姆");
        }
    }
    class Mario : Monster
    {
        public override void BeHit()
        {
            Console.WriteLine("打馬里奧");
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            Monster m = new Mario();
            Monster n = new Slam();
            m.BeHit();
            n.BeHit();
            //p.BeHit();
            Console.ReadKey();
        }
    }

1.父類中要被重寫的方法必須用virtual或者是abstract修飾。
2.子類中用override修飾方法重寫父類方法
這次執行

        Monster m = new Mario();
        Monster n = new Slam();
        m.BeHit();
        n.BeHit();

輸出為:

打馬里奧
打史萊姆      

另外:
virtual修飾的方法叫虛方法,virtual修飾的可以有方法體,子類不一定要重寫
abstract修飾的方法叫抽象方法,abstract修飾的沒有方法體,子類必須要重寫
抽象方法只能在抽象類中宣告,虛方法不是;