C#有关虚方法要知道的知识点:
虚方法:这个方法其实就是为了重写方法而存在的(在声明中包含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 }