如何理解C#中的override和new,看了很多博客和文章,从中收获了不少关于继承和多态的知识。但是理解层面还不够深入,不入本质。
但是,对象以及继承和多态,往往都是和现实世界类比而成的。它们源于现实世界,而高于之。我们何尝不从现实世界入手,对其实现机制进行类比。用我们比较熟悉的方式去理解呢?
见如下代码:
1 namespace ClassLibrary1 2 { 3 public class Teacher 4 { 5 public virtual void Paper() 6 { 7 Console.Write("老师出试卷"); 8 } 9 } 10 public class S1 : Teacher 11 { 12 public override void Paper() 13 { 14 Console.WriteLine("S1做试卷"); 15 } 16 } 17 public class S2 : S1 18 { 19 public override void Paper() 20 { 21 Console.WriteLine("S2重写了S1的试卷"); 22 } 23 } 24 public class S3 : S2 25 { 26 public new void Paper() 27 { 28 Console.WriteLine("S3并没有重写S2的试卷,而是自己重新new了试卷"); 29 } 30 } 31 } 32 33 namespace ConsoleApplication1 34 { 35 class Program 36 { 37 static void Main(string[] args) 38 { 39 40 Teacher t = new Teacher(); 41 t.Paper(); //老师出试卷 42 S1 s1 = new S1(); 43 s1.Paper(); //S1做试卷 44 S2 s2 = new S2(); 45 s2.Paper(); //S2重写了S1的试卷 46 S3 s3 = new S3(); 47 s3.Paper(); //S3并没有重写S2的试卷,而是自己重新new了试卷 48 49 t = s3; 50 t.Paper();//!!S2重写了S1的试卷 51 52 t = s2; 53 t.Paper();//S2重写了S1的试卷 54 55 t = s1; 56 t.Paper();//S1做试卷 57 58 59 } 60 } 61 }
2013-01-05
分析:为什么t=s3,t.Paper()显示结果是S2重写了S1的试卷呢?因为这个引用t是Teacher类的,所以先从Teacher类找到Paper()这个方法,然后发现被重写,所以又找到S1的Paper(),然后发现其又被重写,所以,继续往下走,找到了S2的Paper()。到此处,发现Paper()没有被重新,所以停止。所以使用override会找到被重写的最远的一个方法。通俗讲:老师出了出卷,同学A做了,然后同学B在A的基础上又做了修改...同学n在n-1的基础上又做了修改。所以最后的试卷肯定是第n个童鞋的结果哦。但是new方法只是重新又写了自己的试卷而已。只有通过S3 s3=new S3(),s3.Paper().才能看到自己做的结果。即通过自己的引用处理自己的对象。