虛方法:這個方法其實就是為了重寫方法而存在的(在聲明中包含virtual關鍵字),否則沒感覺到它存在的意義。
其一:因為要重寫所以它的訪問類型如果為private則毫無意義阻礙了重寫動作的進行也就是它不能私有化,所以C#中virtual關鍵字和private關鍵字不能同時使用。
其二:因為靜態的方法和抽象方法不能重寫,同理C#中static,abstract關鍵字和virtual關鍵字不能同時使用。
其三:不能在聲明虛方法的同時指定重寫虛方法,因為重寫方法只能重寫基類的虛方法,也就是要提前在基類中聲明虛方法,所以virtual關鍵字和override關鍵字不能同時使用。
重寫方法:就是使從基類繼承的虛方法提供新的實現(使用關鍵字override聲明),從而為其子類所專有化。
同上面的思路一樣:因為靜態的方法和抽象方法不能重寫,同理C#中static,abstract,new關鍵字和override關鍵字不能同時使用。
總結用法如下:
非虛方法的實現(全部隱藏的虛方法)最初聲明的是什么類的方法就永遠是什么類的方法。
虛方法的實現:最終是什么類型的方法就調用該類型的方法。
(含有隱藏的)虛方法的實現:最終是什么類型的方法就調用(最靠近)該類型的方法。
注:在派生類中重寫基類中的虛方法時,可以使用base關鍵字調用基類中的虛方法。
相關理解程序如下:
1 namespace ClassAB 2 { 3 /* 4 5 public class A 6 { 7 public virtual void Fun1(int i) 8 { 9 Console.WriteLine(i); 10 } 11 public void Fun2(A a) 12 { 13 a.Fun1(1); 14 Fun1(5); 15 } 16 } 17 class Program:A 18 { 19 public override void Fun1(int i) 20 { 21 base.Fun1(i+1); 22 } 23 static void Main(string[] args) 24 { 25 Program b = new Program(); 26 A a = new A(); 27 a.Fun2(b); //2 5 28 b.Fun2(a); //1 6 29 Console.ReadLine(); 30 } 31 } 32 */ 33 /* 34 public abstract class A 35 { 36 public A() 37 { 38 Console.WriteLine('A'); 39 } 40 public virtual void Fun() 41 { 42 Console.WriteLine("A.Fun()"); 43 } 44 } 45 46 class Program :A 47 { 48 public Program() 49 { 50 Console.WriteLine('B'); 51 } 52 public new void Fun() 53 { 54 Console.WriteLine("B.Fun()"); 55 } 56 static void Main(string[] args) 57 { 58 A a = new Program(); 59 a.Fun(); // A B A.Fun() 60 Console.ReadLine(); 61 } 62 } 63 */ 64 65 class BaseClass 66 { 67 public virtual int Add(int x,int y) 68 { 69 return x+y; 70 } 71 } 72 class Program:BaseClass 73 { 74 static int z = 100; 75 public override int Add(int x, int y) 76 { 77 return base.Add(x,y)+z; //300 78 // return x * y; 50 79 } 80 static void Main(string[] args) 81 { 82 BaseClass baseclass = new Program(); 83 Console.WriteLine(baseclass.Add(10,5)); 84 Console.ReadLine(); 85 } 86 }