扯不清楚的virtual和abstract
阿新 • • 發佈:2017-12-05
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= newStu(); 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