如何理解C# 多态中的override和new
2013-01-05 11:45
357 查看
如何理解C#中的override和new,看了很多博客和文章,从中收获了不少关于继承和多态的知识。但是理解层面还不够深入,不入本质。
但是,对象以及继承和多态,往往都是和现实世界类比而成的。它们源于现实世界,而高于之。我们何尝不从现实世界入手,对其实现机制进行类比。用我们比较熟悉的方式去理解呢?
见如下代码:
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().才能看到自己做的结果。即通过自己的引用处理自己的对象。
但是,对象以及继承和多态,往往都是和现实世界类比而成的。它们源于现实世界,而高于之。我们何尝不从现实世界入手,对其实现机制进行类比。用我们比较熟悉的方式去理解呢?
见如下代码:
namespace ClassLibrary1 { public class Teacher { public virtual void Paper() { Console.Write("老师出试卷"); } } public class S1 : Teacher { public override void Paper() { Console.WriteLine("S1做试卷"); } } public class S2 : S1 { public override void Paper() { Console.WriteLine("S2重写了S1的试卷"); } } public class S3 : S2 { public new void Paper() { Console.WriteLine("S3并没有重写S2的试卷,而是自己重新new了试卷"); } } } namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Teacher t = new Teacher(); t.Paper(); //老师出试卷 S1 s1 = new S1(); s1.Paper(); //S1做试卷 S2 s2 = new S2(); s2.Paper(); //S2重写了S1的试卷 S3 s3 = new S3(); s3.Paper(); //S3并没有重写S2的试卷,而是自己重新new了试卷 t = s3; t.Paper();//!!S2重写了S1的试卷 t = s2; t.Paper();//S2重写了S1的试卷 t = s1; t.Paper();//S1做试卷 } } }
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().才能看到自己做的结果。即通过自己的引用处理自己的对象。
相关文章推荐
- 如何理解C# 多态中的override和new
- 理解c#中的interface abstract virtual override和new(转)
- c#中关于virtual,override和new的理解
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
- C#.NET常见问题(FAQ)-override覆盖和virtual虚类如何理解
- C# 继承与多态,相关关键字virtual、override、new
- C#中多态override 和new的区别
- 我理解c#中的interface abstract virtual override和new(转)
- C#.NET学习笔记---C#中方法覆盖时override和new的比较,abstract和virtual的比较(含C#多态的实现)
- 【KK学习笔记】c# 虚方法 virtual 、 重写方法 override 、new 的使用与理解
- 深入理解C#中new、override、virtual关键字的区别
- 我理解c#中的interface abstract virtual override和new
- C#中的Virtual、Override和new关键词理解
- C#中多态override 和new的区别
- dot net 中的C#的重写(override)和重载(overload)的理解
- C#中隐藏(new)、方法重写(override)、重载(overload)的区别
- C#中重写(override)和覆盖(new)的区别
- 如何理解和实现c#事件
- C#的内存管理:堆、栈、托管堆与指针(助于理解 new struct using)
- Net学习难点讨论系列2 – 细说C#中new关键字与多态