zoukankan      html  css  js  c++  java
  • 如何理解C# 多态中的override和new

    如何理解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().才能看到自己做的结果。即通过自己的引用处理自己的对象。

    作者水平有限,错误和不当表述欢迎读者给出指正和建议
    联系邮箱wangzhen199009@126.com
  • 相关阅读:
    ListComparer
    C#.net中类与结构的区别
    对C# 中堆栈,堆,值类型,引用类型的理解
    一道面试题
    Mvc不等于三层架构
    SQL养成一个好习惯是一笔财富
    清除MSSQL事务日志文件
    面向对象设计(OOD)五大基本原则
    .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一
    IIS7 Login failed for user IIS APPPOOL\ASP.NET v4.0
  • 原文地址:https://www.cnblogs.com/zzPrince/p/2845523.html
Copyright © 2011-2022 走看看