C#中的virtual和override關鍵字
??公眾號「DotNet學習交流」,分享學習DotNet的點滴。
使用基類中的引用
class MyBaseClass //基類
{
public void Print()
{
Console.WriteLine("This is the base class");
}
}
?
class MyDerivedClass : MyBaseClass //派生類
{
new public void Print()
{
Console.WriteLine("This is the derived class");
}
}
internal class Program
{
static void Main(string[] args)
{
MyDerivedClass myDerived = new MyDerivedClass();
MyBaseClass myBaseClass = (MyBaseClass)myDerived; //轉換成基類
myDerived.Print(); //從派生類部分調用Print方法
myBaseClass.Print(); //從基類部分調用Print方法
}
}
運行結果如下:

可以發現派生類調用的是派生類的方法,而基類調用的是基類的方法。
虛方法和覆寫方法
虛方法可以使基類的引用訪問“升至”派生類內,可以使基類引用調用派生類(derived class)的方法,只需滿足下面的條件。
1、派生類的方法和基類的方法有相同的簽名和返回類型。
2、基類的方法使用virtual標注。
3、派生類的方法使用override標注。
使用virtual和override的例子如下:
class MyBaseClass //基類
{
virtual public void Print()
{
Console.WriteLine("This is the base class");
}
}
?
class MyDerivedClass : MyBaseClass //派生類
{
override public void Print()
{
Console.WriteLine("This is the derived class");
}
}
class SecondDerivedClass : MyDerivedClass //派生類
{
override public void Print()
{
Console.WriteLine("This is the second derived class");
}
}
?
internal class Program
{
static void Main(string[] args)
{
SecondDerivedClass myDerived = new SecondDerivedClass();
MyBaseClass myBaseClass = (MyBaseClass)myDerived; //轉換成基類
myDerived.Print(); //從派生類部分調用Print方法
myBaseClass.Print(); //從基類部分調用Print方法
}
}
運行結果如下所示:

不論是通過派生類調用還是通過基類調用,都會調用最高派生類中的方法,當通過基類調用時,調用被沿著繼承層次向上傳遞,如下圖所示:

SecondDerivedClass中的Print方法聲明為override,它會覆寫方法中的全部兩個低派生級別的版本。
如果將SecondDerivedClass中的Print方法聲明為new,代碼如下所示:
class MyBaseClass //基類
{
virtual public void Print()
{
Console.WriteLine("This is the base class");
}
}
?
class MyDerivedClass : MyBaseClass //派生類
{
override public void Print()
{
Console.WriteLine("This is the derived class");
}
}
class SecondDerivedClass : MyDerivedClass //派生類
{
new public void Print()
{
Console.WriteLine("This is the second derived class");
}
}
?
internal class Program
{
static void Main(string[] args)
{
SecondDerivedClass myDerived = new SecondDerivedClass();
MyBaseClass myBaseClass = (MyBaseClass)myDerived; //轉換成基類
myDerived.Print(); //從派生類部分調用Print方法
myBaseClass.Print(); //從基類部分調用Print方法
}
}
運行結果如下所示:

當Print方法通過SecondDerivedClass的引用調用時,SecondDerivedClass中的方法被執行,而當方法通過MyBaseClass的引用調用時,方法調用只向上傳遞了一級,到達類MyDerivedClass,在那里被執行。該過程的圖示如下所示:

覆蓋其他成員類型
其實屬性事件以及索引器也是一樣。
只讀屬性使用virtual/override的例子
代碼如下:
class MyBaseClass //基類
{
private int _myInt = 5;
virtual public int MyProperty
{
get { return _myInt; }
}
}
?
class MyDerivedClass : MyBaseClass //派生類
{
private int _myInt = 10;
override public int MyProperty
{
get { return _myInt; }
}
}
?
internal class Program
{
static void Main(string[] args)
{
MyDerivedClass myDerived = new MyDerivedClass();
MyBaseClass myBaseClass = (MyBaseClass)myDerived; //轉換成基類
Console.WriteLine(myDerived.MyProperty);
Console.WriteLine(myBaseClass.MyProperty);
}
}
運行結果如下所示:


浙公網安備 33010602011771號