C#關鍵字-Override 和 New 的使用
以下範例可示範Override 和 New 的使用
範例一、
1 | using System; |
執行結果
說明:
1、Paper為父類別,Book為衍生類別;我們特別注意 becomePaper 變數,
becomePaper 變數是由 Book衍生類別轉型成 Paper父類別,
執行 becomePaper.Show()時,由於 Book衍生類別裡的 Show()方法,使用關鍵字「new」,
所以很直覺的以「何種型別就使用該型別自己的同名方法」來處理,
現在 becomePaper 變數算是父類別,所以是呼叫父類別裡的 Show()方法。
但 becomePaper.Show2() 方法就不一樣了,其使用關鍵字「override」,
意思為不管變數是否有轉型為父類別,呼叫的同名方法一律以有指定關鍵字「override」的方法來執行。
2、使用關鍵字「override」時需注意,父類別的方法需加註關鍵字「virtual」。
範例二、
using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
Test1();
Test2();
Test3();
Console.ReadKey();
}
public static void Test1()
{
Paper Paper = new Paper();
Paper.CallShow();
Book Book = new Book();
Book.CallShow();
Letter Letter = new Letter();
Letter.CallShow();
Console.WriteLine();
}
public static void Test2()
{
Book Book = new Book();
Letter Letter = new Letter();
Book.Show();
Letter.Show();
Console.WriteLine();
}
public static void Test3()
{
Paper Book = new Book();
Paper Letter = new Letter();
Book.Show();
Letter.Show();
Console.WriteLine();
}
}
class Paper
{
public string source = "wood";
public virtual void CallShow()
{
System.Console.WriteLine("next to call Show() method");
Show();
}
public virtual void Show()
{
Console.WriteLine("this is paper");
}
}
class Book : Paper
{
public new void Show()
{
Console.WriteLine("this is Book (new)");
}
}
class Letter : Paper
{
public override void Show()
{
Console.WriteLine("this is Letter (override)");
}
}
}
執行結果
說明:
只看 test1() 方法中的三個小呼叫,其他例子請自行參考,
Paper Paper = new Paper();
Paper.CallShow();
CallShow() 是父類別的方法,Paper 類別也是父類別,執行上很直覺無疑問。
Book Book = new Book();
Book.CallShow();
藉由 Book變數呼叫 CallShow() 父類別方法,但注意到CallShow()方法中,
還會去執行同名方法 Show();一般人可能認為 Book變數並沒有轉型,
所以看到 Book類別裡有使用關鍵字「new」的Show()方法,
應該會出現「this is Book (new)」訊息才對。
但由於是利用父類別方法 CallShow() 去執行同名方法 Show(),
故,會執行父類別底下的 virtual Show()方法。
Letter Letter = new Letter();
Letter.CallShow();
此例也是藉由 Letter變數呼叫 CallShow() 父類別方法,但跟上例不同的是,
Letter類別裡有使用關鍵字「override」的Show()方法,
關鍵為 Letter變數是衍生型別,當底下有指定「override」方法時,
不管是否間接利用父類別方法去執行同名方法 Show(),
則一律呼叫衍生型別底下的同名方法。
以下節錄自 吉米.NET 我覺得很有道理作為本文總結
1、override 覆寫繼承自基礎類別的 virtural 方法,可以理解為拆掉老房子,
在原址上建新房子,老房子再也找不到了(基礎類別方法永遠調用不到了)。
2、new 隱藏繼承自基礎類別的virtual方法,老房子還留着,
在旁邊蓋個新房子,想住新房子的住新房子(作為衍生類別對象調用),
想住老房子住老房子(作為基礎類別對象調用)。
參考資料:
了解使用 Override 和 New 關鍵字的時機 (C# 程式設計手冊)