學習筆記:C#入門(六)繼承&多型:方法重寫override virtual&abstract虛方法和抽象方法
首先來一段程式碼,看一下繼承的關係
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修飾的沒有方法體,子類必須要重寫
抽象方法只能在抽象類中宣告,虛方法不是;