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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Maidsafe-去中心化互联网白皮书
    The Top 20 Cybersecurity Startups To Watch In 2021 Based On Crunchbase
    Top 10 Blockchain Security and Smart Contract Audit Companies
    The 20 Best Cybersecurity Startups To Watch In 2020
    Blockchain In Cybersecurity: 11 Startups To Watch In 2019
    004-STM32+BC26丨260Y基本控制篇(阿里云物联网平台)-在阿里云物联网平台上一型一密动态注册设备(Android)
    涂鸦开发-单片机+涂鸦模组开发+OTA
    000-ESP32学习开发-ESP32烧录板使用说明
    03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序
    03-STM32+Air724UG远程升级篇OTA(自建物联网平台)-STM32+Air724UG实现利用http/https远程更新STM32程序(TCP指令,单片机程序检查更新)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1452680.html
Copyright © 2011-2022 走看看