如何理解C# 多态中的override和new

如何理解C#中的override和new,看了很多博客和文章,从中收获了不少关于继承和多态的知识。但是理解层面还不够深入,不入本质。

但是,对象以及继承和多态,往往都是和现实世界类比而成的。它们源于现实世界,而高于之。我们何尝不从现实世界入手,对其实现机制进行类比。用我们比较熟悉的方式去理解呢?

见如下代码:

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做试卷


        }
    }
}


分析:为什么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().才能看到自己做的结果。即通过自己的引用处理自己的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值