C#學習篇2:過載和重寫 虛方法和抽象方法
阿新 • • 發佈:2018-11-07
本篇問轉載文章,僅供學習使用。。。
過載(overload): 在同一個作用域(一般指一個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點(俗稱兩必須一可以):
- 方法名必須相同
- 引數列表必須不相同
- 返回值型別可以不相同
例如:
public void Sleep()
{
Console.WriteLine("Animal睡覺");
}
public int Sleep(int time)
{
Console.WriteLine("Animal{0}點睡覺", time);
return time;
}
2、重寫(override)
- 相同的方法名
- 相同的引數列表
- 相同的返回值
如:父類中的定義:
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();
}