一、virtual和override
1. 問題引入:使用里氏替換原則時,使用父類容器裝載子類對象,若不使用virtual和override而是使用new,當子類調用兩個類共有的方法時,調用的是父類的方法而不是子類的方法:
using System;namespace Polymorphism
{class Program{static void Main(string[] args){// 使用new關鍵字隱藏父類方法Father son = new Son();son.fun(); // 輸出:調用父類fun()方法(son as Son).fun(); // 輸出:調用子類fun()方法}}// 使用new關鍵字隱藏父類方法class Father{public void fun(){Console.WriteLine("調用父類fun()方法");}}class Son : Father{public new void fun() // 使用new關鍵字隱藏父類方法{Console.WriteLine("調用子類fun()方法");}}
}
運行結果如下:
2. virtual:使父類的方法變為虛方法,可以被子類重寫
3. override:使子類的方法重寫父類的方法
4. 使用:
using System;namespace Polymorphism
{class Program{static void Main(string[] args){// 使用new關鍵字隱藏父類方法 Father son = new Son();son.fun(); // 輸出:調用父類fun()方法(son as Son).fun(); // 輸出:調用子類fun()方法// 使用override關鍵字重寫父類方法GameObject player = new Player();player.ATK(); // 輸出:Player攻擊(player as Player).ATK(); // 輸出:Player攻擊}}// 使用new關鍵字隱藏父類方法class Father{public void fun(){Console.WriteLine("調用父類fun()方法");}}class Son : Father{public new void fun() // 使用new關鍵字隱藏父類方法{Console.WriteLine("調用子類fun()方法");}}// 使用override關鍵字重寫父類方法class GameObject{public virtual void ATK(){Console.WriteLine("Gameobject攻擊");}}class Player : GameObject{public override void ATK() // 使用override關鍵字重寫父類方法{Console.WriteLine("Player攻擊");}}
}
運行結果如下:
二、保留父類行為
1. 關鍵字:base
2. 作用:調用父類的方法
3. 使用:
using System;namespace Polymorphism
{class Program{static void Main(string[] args){// 使用new關鍵字隱藏父類方法 Father son = new Son();son.fun(); // 輸出:調用父類fun()方法(son as Son).fun(); // 輸出:調用子類fun()方法// 使用override關鍵字重寫父類方法GameObject player = new Player();player.ATK(); // 輸出:Player攻擊(player as Player).ATK(); // 輸出:Player攻擊// 使用多態調用父類方法GameObject enemy = new Enemy();enemy.ATK(); // 輸出:Gameobject攻擊}}// 使用new關鍵字隱藏父類方法class Father{public void fun(){Console.WriteLine("調用父類fun()方法");}}class Son : Father{public new void fun() // 使用new關鍵字隱藏父類方法{Console.WriteLine("調用子類fun()方法");}}// 使用override關鍵字重寫父類方法class GameObject{public virtual void ATK(){Console.WriteLine("Gameobject攻擊");}}class Player : GameObject{public override void ATK() // 使用override關鍵字重寫父類方法{Console.WriteLine("Player攻擊");}}class Enemy : GameObject{public override void ATK() // 使用override關鍵字重寫父類方法{Console.Write("Enemy: ");base.ATK(); // 保留父類行為}}
}
運行效果如下:
? ? ? ? 今天的學習就到這里了。感謝閱讀。
? ? ? ? 再見!