Virtual
virtual
官方描述:關鍵字用於修改方法、屬性、索引器或事件聲明,並使它們可以在派生類中被重寫。
配合的關鍵字
override
官方描述:擴展或修改繼承的方法、屬性、索引器或事件的抽象或虛擬實現需要 override 修飾符。new
修飾符 官方描述:在用作聲明修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。 隱藏繼承的成員時,該成員的派生版本將替換基類版本。 雖然可以不使用 new 修飾符來隱藏成員,但將收到編譯器警告。 如果使用 new 來顯式隱藏成員,將禁止此警告。(new有很多用途,這裏主要用作於修飾符)
項目源碼地址:https://gitee.com/michel4liu/LearnCSharp.git
項目:LearnVirtual
環境VS2017 .NET Core2.0
virtual+override 比較常見的用法
static void Main(string[] args)
{
Father f = new Father();
f.DoSomething();//輸出 Father.Work
Son s = new Son();
s.DoSomething();//輸出 Son.Learn
Father fs = new Son();
fs.DoSomething();//輸出 Son.Learn
}
class Father
{
public virtual void DoSomething()
{
Console.WriteLine($"{nameof(Father)}.Work");
}
}
class Son : Father
{
public override void DoSomething()
{
Console.WriteLine($"{nameof(Son)}.Learn");
}
}
重點在於第三個輸出
Father fs = new Son();
fs.DoSomething(); //輸出 Son.Learn
因 Son 利用關鍵字 override 重寫 DoSomething() 所以用Father聲明接收時也能指向Son.DoSomething()
virtual+New
static void Main(string[] args)
{
Father f = new Father();
f.DoSomething();//輸出 Father.Work
Son s = new Son();
s.DoSomething();//輸出 Son.Learn
Father fs = new Son();
fs.DoSomething();//輸出 Father.Learn
}
class Father
{
public virtual void DoSomething()
{
Console.WriteLine($"{nameof(Father)}.Work");
}
}
class Son : Father
{
public new void DoSomething()
{
Console.WriteLine($"{nameof(Son)}.Learn");
}
}
重點在於第三個輸出
Father fs = new Son();
fs.DoSomething(); //輸出 Son.Learn
因 Son 利用關鍵字 new 隱藏繼承DoSomething() 所以用Father聲明接收Son對象時只能指向Father.DoSomething()
注意點
- 如果Father和Son 中都不指定virtual、override 、new 關鍵字,編譯默認使用new,編譯器會報警告。
- New和Override 關鍵字互斥的。不可以同時使用。
- New重寫後能通過轉換(如獲取父對象調用或base.方法())找到基類的方法,Override 重寫後則無法找到基類方法。