[你必须知道的.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不会被执行!大家可以自己去试一下

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

2017.5.26暴力赛解题报告

预计分数:T1:40AC+60TLE      T2:40AC+60TLE        T3:10AC+90TLE      总分=90 实际分数:T1:10...

39560
来自专栏写代码的海盗

乐呵乐呵得了 golang入坑系列

开场就有料,今天返回去看了看以前的文章,轻松指数有点下降趋势。一琢磨,这不是我的风格呀。一反思,合着是这段时间,脑子里杂七杂八的杂事有点多,事情一多,就忘了快乐...

35950
来自专栏HansBug's Lab

1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路

1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec  Memory L...

33860
来自专栏HansBug's Lab

1934: [Shoi2007]Vote 善意的投票

1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1174  ...

29470
来自专栏玄魂工作室

56行Python代码实现身份证字典生成器

最近过生日,女朋友送了几本Python黑客编程的书(没错,小黑阔也是可以有女朋友的)。哈哈,皮一下就是很开心。

49330
来自专栏lonelydawn的前端猿区

Node.js力破江苏网警刑侦科推理试题

月前,江苏网警 在微博发布了一套《2018年刑侦科目推理试题》,可谓难倒了诸多英雄好汉,评论区内更是一片皮皮之音。 @二向箔icon: 高考前班主任教过我们,...

34970
来自专栏aCloudDeveloper

string 之 strlen函数

Author: bakari  Date: 2012/8/9 近两年好多的IT公司喜欢拿一些库函数来考,string函数库当然是首选,除此之外,像qsort,S...

20670
来自专栏tkokof 的技术,小趣及杂念

侃侃哈希表

说到哈希表,相信初通数据结构的人士应该耳熟能详,其相关的结构细节虽然并不繁复,但就快速查找数据而言,该结构优异的性能表现绝对可算一枝独秀,平均情况下O(1)的时...

8410
来自专栏Java帮帮-微信公众号-技术文章全总结

【学习经验】Java中常用英文

【学习经验】Java中常用英文 第一章: public['pʌblik] 公共的,公用的 static['stætik] 静的;静态的...

373100
来自专栏WOLFRAM

Wolfram 神器秒杀高考数学试题

18340

扫码关注云+社区

领取腾讯云代金券