zoukankan      html  css  js  c++  java
  • [你必须知道的.Net]读书笔记override与new在继承中的区别

    前言:
    这本书拿到手已经好长时间了,但由于种种原因一直没读完,也许是我太懒了,应该好好反省自我检讨一下。

    所谓“书读百遍,其义自见”,虽然糊里糊涂做web开发六七年了,用.net也3年出头,但总觉得自己还是一个.net新手,很多东西只知道怎么用,但不知道为什么?

    虽然老赵曾经讲过的一个观点我也很赞同,原话已经记不清了,大意是说:很多数学上的公理公式,只要前人(或自己)证明过是对的,以后再用时,谁会一次次的再重复去证明,直到证明结果弄对了再拿来用?但是有些问题还要是有比较深刻理解的,否则经常会在开发过程中遇到一些莫名其妙的问题,不明白背后的真相,自个儿费劲猜个半天,还是不知所以然,弄得信心全无。

    在当今新技术不断发展的今天,除了及时关注.net的发展,还是有必要静下心来好好整理整理,定期把工作中遇到的各种问题(特别是技术上模凌两可,只知其然但不知其所以然的问题)弄个究竟,长

    期坚持下去,相信必有收获。

    1.override与new在继续中的差异

    先上一段测试代码


    using System;

    namespace Overload_Override
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {
                Father B 
    = new Father();
                B.MyFunc(
    "BBB");//调用的是Father.MyFunc()
                Console.WriteLine("-------------------------");

                Child A 
    = new Child();
                B 
    = A;//B的引用指向A
                A.MyFunc("AAA");//调用Child.MyFunc()
                Console.WriteLine("-------------------------");           


                B.MyFunc(
    "BBB");//注1:猜猜这里调用的是谁?
                Console.WriteLine("-------------------------");

                Father C 
    = new Child();
                C.MyFunc(
    "CCC");//注2:同样也猜猜这里调用的是啥?

                Console.Read();
            }
        }


        
    class Father {
            
    public virtual void MyFunc(string str) {
                Console.WriteLine(
    "{0} in Base", str);
            }
        }

        
    class Child : Father 
        {
            
    public override void MyFunc(string str)
            {
                
    base.MyFunc(str);
                Console.WriteLine(
    "{0} in Derived", str);
            }
        }
    }

    运行结果:
    BBB in Base
    -------------------------
    AAA in Base
    AAA in Derived
    -------------------------
    BBB in Base
    BBB in Derived
    -------------------------
    CCC in Base
    CCC in Derived

    这个好象很容易理解,学习面向对象时估计都学过,子类覆写父类的方法

    接下来,把子类的public override void MyFunc(string str)中的override换成new,再次运行,结果如下:
    BBB in Base
    -------------------------
    AAA in Base
    AAA in Derived
    -------------------------
    BBB in Base
    -------------------------
    CCC in Base

    注1注2处的运行结果少了一行,仅调用了父类Father的MyFunc,对于.Net中新加的new关键字如何理解?

    参阅该书
    1.2.3继续本质论 P14到P15页
    7.6.5进一步的讨论1.override与new的版本控制 P300到P301页
    就能找到答案,我个人的理解如下(也许我的理解仍然不对,欢迎拍砖):


    注1处: B的引用指针还是Father类型指针,但如果子类Child的MyFunc在new关键字情况下,隐藏了父类的MyFunc,而把子类自己的MyFunc做为一个独立的新方法(可以极端的想象为此时子类的MyFunc跟父类的MyFunc没有任何关系,只是凑巧名称相同而已)。方法调用时,.Net规定不同的类型指针只能在特定的地址区域内执行,因为这时子类的MyFunc无法覆盖父类的MyFunc,因此最终调用的是Father.MyFunc();但是如果子类Child的MyFunc在override关键字情况下,子类的同名方法会覆盖父母的方法,这里方法调用时,会递归查找子类中的同名方法最终版本,因而调用的是Child.MyFunc

    注2处:其实跟注1是完全一样的

    为啥要研究这个貌似“无聊”的东东,下面谈一点实际web开发中的应用:

    web项目中,通常会有一些公用的功能,为了提高代码重用率,不至于每个Page中都copy同样的代码,我们可以先定义一个Page的通用父类,比如下面这样

    Code
    using System;

    namespace OverrideWeb
    {
        
    public partial class CommPage : System.Web.UI.Page
        {
            
    protected virtual void Page_Load(object sender, EventArgs e)
            {
                Response.Write(
    "CommPage.Page_Load<br/>");
            
    //to do list
            }        
        }
    }

    其它页面继承自该页:

    Code
    using System;

    namespace OverrideWeb
    {
        
    public partial class _Default : CommPage
        {
            
    protected override void Page_Load(object sender, EventArgs e)
            {
                
    base.Page_Load(sender, e);
                Response.Write(
    "Derived Page_Load();<br/>");
            }        
        }
    }

    问题就来了,如果这里的override改成new或忘记了写(不写的情况下,系统默认为new关键字),最后运行时子类_Default中的Page_Load不会被执行!大家可以自己去试一下

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    冲刺第十三天
    冲刺第十二天
    冲刺第十一天
    Android Studio三种运行方法
    第十三周学习进度
    冲刺第一阶段意见评论
    第十二周学习进度
    冲刺第十天
    大二暑假周总结(五)
    大二暑假周总结(四)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1452680.html
Copyright © 2011-2022 走看看