1. 程式人生 > >扯不清楚的virtual和abstract

扯不清楚的virtual和abstract

student write net 2.0 圖片 div () ons stat

定義Person類:

1     class Person
2     {
3         public void Say()
4         {
5             Console.WriteLine("I am a person");
6         }
7     }

現在,我想定義一個Stu類, 並且繼承Person類,並且我想讓Stu類有屬於自己的Say方法

1  class Stu:Person
2     {
3         public string school="Oxford";
4         public void Say()
5         {
6 Console.WriteLine("I am a student from " + school); 7 } 8 }

然後,在Main函數中,分別實例化Person類和Stu類

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Person person = new Person();
 6             person.Say();
 7 
 8             Stu stu= new
Stu(); 9 stu.Say(); 10 11 person=stu; 12 person.Say(); 13 } 14 }

在控制臺中,輸入csc Program.cs編譯,如下圖

技術分享圖片

(請選擇你自己喜歡的編譯器,並包含編譯器的位置到path環境變量中,如path=%path%;C:\Windows\Microsoft.NET\Framework64\v2.0.50727)

編譯後,如上圖我們看到有個警告,意思是Stu類中的Say方法,隱藏了Person類中的Say方法,如果確實有需要,喊我們顯示地使用new關鍵字去隱藏,做如下改動

1     class Stu:Person
2     {
3         public string school="Oxford";
4         public new void Say()
5         {
6             Console.WriteLine("I am a student from " + school);
7         }
8     }

編譯後,沒發現警告了,可運行效果並不是我想要的,最後一行的輸出,並沒有實現多態

技術分享圖片

現在在父類使用virtual關鍵字,在子類使用override關鍵字重寫父類的方法。

 1  class Person
 2     {
 3         public virtual void Say()
 4         {
 5             Console.WriteLine("I am a person");
 6         }
 7     }
 8 
 9     class Stu:Person
10     {
11         public string school="Oxford";
12         public override void Say()
13         {
14             Console.WriteLine("I am a student from " + school);
15         }
16     }

運行效果如下:

技術分享圖片

這樣,我們通過在父類使用virtual關鍵字修飾方法,在子類使用override關鍵字重寫父類方法,這樣我們就正確實現了多態。

除了virtual關鍵字,我們還可以使用abstract關鍵字修飾父類的方法,可以實現相類似的功能,但abstract修飾的方法不能有實現,並且該方法所在的類必須是abstract類

扯不清楚的virtual和abstract