[你必须知道的.Net]读书笔记--override与new在继承中的区别

简介: 前言:这本书拿到手已经好长时间了,但由于种种原因一直没读完,也许是我太懒了,应该好好反省自我检讨一下。 所谓“书读百遍,其义自见”,虽然糊里糊涂做web开发六七年了,用.net也3年出头,但总觉得自己还是一个.

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

所谓“书读百遍,其义自见”,虽然糊里糊涂做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不会被执行!大家可以自己去试一下

目录
相关文章
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
460 7
|
网络协议 大数据 网络架构
桥接模式和NET模式的区别
桥接模式和NET模式的区别
611 0
|
开发框架 前端开发 中间件
聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别
聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别
321 1
|
开发框架 安全 Java
.net和java有什么样的区别?
Java和.NET在本质、编程语言、生态系统与工具、跨平台性、应用领域、性能与效率以及安全性与可靠性等方面都存在明显的区别。选择哪个平台取决于具体的需求、技术栈和目标平台。
974 7
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
242 0
【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集
【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集
|
Windows
【vb.net】——窗体继承
【vb.net】——窗体继承
332 0
【vb.net】——窗体继承
|
Java C# C语言
【.Net vs Java? 】 先来看一下Java和C#的数据类型区别。
新工作.Net和Java都要做,早期也做过一段Java的项目,但没有系统的深入学习过。一直觉得这两门语言估计是最相近的两门语言了,好多代码可以说直接拷过来都不带报错的,但仔细推敲还是有很多的不同。
271 0
【.Net vs Java? 】 先来看一下Java和C#的数据类型区别。
|
开发框架 .NET 数据库连接
asp.net中引用与using的区别
  项目添加引用的目的是引入程序集   程序集的概念是什么?   程序集是一个 DLL,这是调用其中类的必备条件 一个程序集包括一个或多个命名空间 举例来说 命名空间 System.Data 来自文件 System.Data.DLL 命名空间 System.Data.SqlClient 同样来自 System.Data.DLL 那么意味着你一旦添加了 System.Data 程序集 文件的引用(无论你是从 GAC 添加还是直接添加的 DLL 到项目) 你就可以使用 System.Data 和 System.Data.SqlClient 下的各种类   为什么要 using 呢?
168 0

热门文章

最新文章