class Parent
{
public string Method()
{
return virtualMethod() + "\nParent Method";
}
public virtual string virtualMethod()
{
return "Parent Virtual Method! ";
}
}
class ChildNew : Parent
{
public new string virtualMethod()
{
return "Son New Virtual Method! ";
}
}
class ChildOverride : Parent
{
public override string virtualMethod()
{
return "Son Override Virtual Method! ";
}
}
class Program
{
static void Main(string[] args)
{
ChildNew cn = new ChildNew();
// new 可以透過轉型呼叫原來的 virtual method
Console.WriteLine(((Parent)cn).virtualMethod());
Console.WriteLine(cn.virtualMethod());
// Parent.Method 呼叫的 virtual Method 是 Parent 類的,因為 new 只是隱藏原來的 virtual method
Console.WriteLine(cn.Method());
Console.WriteLine();
ChildOverride co = new ChildOverride();
// override 無法透過轉型呼叫原來的 virtual method
Console.WriteLine(((Parent)co).virtualMethod());
Console.WriteLine(co.virtualMethod());
// Parent.Method 呼叫的 virtual Method 是 Child 類的,因為 override 已經覆蓋原來的 virtual method
Console.WriteLine(co.Method());
Console.WriteLine();
// 多型
Parent po = new ChildOverride();
// 呼叫的是 Child 類的 virtual method
Console.WriteLine(po.virtualMethod());
Console.WriteLine();
Parent pn = new ChildNew();
// 呼叫的是 Parent 類的 virtual method
Console.WriteLine(pn.virtualMethod());
Console.Read();
}
}
結論
如果是override,就和一般的繼承一樣,但若是用到new,就是看變數型別來決定呼叫的是哪裡的方法,如果這個變數型別裡面的方法是繼承而來的,就會回到父層去執行,而如果父層裡面還有呼叫其他方法,只要子層沒有override,則都會執行父層的方法。