1. 程式人生 > >C#學習篇2:過載和重寫 虛方法和抽象方法

C#學習篇2:過載和重寫 虛方法和抽象方法

本篇問轉載文章,僅供學習使用。。。

過載(overload): 在同一個作用域(一般指一個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點(俗稱兩必須一可以):

  • 方法名必須相同
  • 引數列表必須不相同
  • 返回值型別可以不相同

例如:

public void Sleep()
{
    Console.WriteLine("Animal睡覺");
}
public int Sleep(int time)
{
    Console.WriteLine("Animal{0}點睡覺", time);
    return time;
}

2、重寫(override)

:子類中為滿足自己的需要來重複定義某個方法的不同實現,需要用 override 關鍵字,被重寫的方法必須是虛方法,用的是 virtual 關鍵字。它的特點是(三個相同):

  • 相同的方法名
  • 相同的引數列表
  • 相同的返回值

如:父類中的定義:

public virtual void EatFood()
{
    Console.WriteLine("Animal吃東西");
}

子類中的定義:

public override void EatFood()
{
    Console.WriteLine("Cat吃東西");
    //base.EatFood();
}

小提示:經常有童鞋問過載和重寫的區別,而且網路上把這兩個的區別作為 C# 做常考的面試題之一。實際上這兩個概念完全沒有關係,僅僅都帶有一個“重”字。他們沒有在一起比較的意義,僅僅分辨它們不同的定義就好了。

虛方法和抽象方法的區別是:因為抽象類無法例項化,所以抽象方法沒有辦法被呼叫,也就是說抽象方法永遠不可能被實現。

虛方法的呼叫:呼叫上,使用子類構造的物件呼叫虛方法,就會呼叫子類的方法,使用父類構造的物件,就會呼叫父類的方法。

隱藏方法的呼叫:呼叫上, 使用子類型別的宣告呼叫隱藏方法,就會呼叫到子類的方法。若想呼叫被隱藏的方法,需要用父類型別的宣告來呼叫。

呼叫不同的舉例:

class Enemy
{
    public void Move() {
        Console.WriteLine("呼叫了 enemy的move方法");
    }
    public virtual void Attack() {
        Console.WriteLine("enemy attac");
    }
    }


    class Boss : Enemy
    {
    public override void Attack() {
        Console.WriteLine("Boss Attac");
    }

    public new void Move() {
        Console.WriteLine("Boss move");
    }
}

static void Main(string[] args)
{
    //---- 隱藏方法的呼叫----begin
    Boss oneEnemy = new Boss();
    oneEnemy.Move(); // 呼叫的是隱藏方法, 用子類的宣告來呼叫的,呼叫的就是子類的Move。

    Enemy twoEnemy = new Boss();
    twoEnemy.Move(); // 呼叫的隱藏方法, 用父類的宣告來呼叫的,呼叫的就是父類的Move方法。
    //-----------------------end

    //-----虛方法的呼叫----- begin
    用什麼型別 來構造,在呼叫方法的時候就會呼叫什麼型別的方法。

    Enemy threeEnemy = new Enemy();
    threeEnemy.Attac(); // 呼叫虛方法,用父類來例項化的,所以呼叫的是父類的Attac方法。

    Enemy fourEnemy = new Boss();
    fourEnemy.Attac();  // 呼叫虛方法,用子類來例項化的,所以呼叫的就是子類(Boss)的Attac方法。

    //-----虛方法的呼叫------end

    Console.ReadKey();
}