实例讲解override和new的区别
一、override:Override关键字主要是提供派生类对基类方法的新实现。
1、不可以用于重写非虚方法和静态方法
2、与其配套使用的关键字是Virtual、abstract、Override。
3、不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
二、new:new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。
可以对基类的虚方法、普通方法进行操作
三、Virtual:允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写。virtual关键字不可以与static、abstract、private、override一起使用。Virtual关键字和override紧密不可分的,如果要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。
四、下面一个小例子进行讲解,耐心看完,一目了然。
class A { public virtual void Func() // 注意virtual,表明这是一个虚拟函数 { Console.WriteLine("Func In A"); } } class B : A // 注意B是从A类继承,所以A是父类,B是子类 { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine("Func In B"); } } class C : B // 注意C是从B类继承,所以B是父类,C是子类 { } class D : A // 注意D是从A类继承,所以A是父类,D是子类 { public new void Func() // 注意new ,表明覆盖父类里的同名类,而不是重新实现 { Console.WriteLine("Func In D"); } } class Program { static void Main(string[] args) { A a; // 定义一个a这个A类的对象.这个A就是a的申明类 A b; // 定义一个b这个A类的对象.这个A就是b的申明类 A c; // 定义一个c这个A类的对象.这个A就是c的申明类 A d; // 定义一个d这个A类的对象.这个A就是d的申明类 a = new A(); // 实例化a对象,A是a的实例类 b = new B(); // 实例化b对象,B是b的实例类 c = new C(); // 实例化c对象,C是c的实例类 d = new D(); // 实例化d对象,D是d的实例类 a.Func(); // 执行a.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类A,就为本身 4.执行实例类A中的方法 5.输出结果 Func In A b.Func(); // 执行b.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类B,有重载的 4.执行实例类B中的方法 5.输出结果 Func In B c.Func(); // 执行c.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类C,无重载的 4.转去检查类C的父类B,有重载的 5.执行父类B中的Func方法 5.输出结果 Func In B d.Func(); // 执行d.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类D,无重载的(这个地方要注意了,虽然D里有实现Func(),但没有使用override关键字,所以不会被认为是重载) 4.转去检查类D的父类A,就为本身 5.执行父类A中的Func方法 5.输出结果 Func In A D d1 = new D(); d1.Func(); // 执行D类里的Func(),输出结果 Func In D Console.ReadLine(); } }
1、首先检查的都是申明类
2、如果申明类是虚方法,则去检查实例类
3、如果实例类没实现,则使用父类中的虚方法。(优先级最后)
4、new的时候,虽然继承类中也有同名方法,但是已经与父类那个没有关系。故也不会调用到这个方法。除非是以子类申明的对象才能调用的到。
转载于:https://www.cnblogs.com/xyang/archive/2012/05/08/2490092.html
实例讲解override和new的区别相关推荐
- JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...
本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...
- 守护线程和用户线程的真正区别(实例讲解)
java 中的线程分为两种:守护线程(Daemon)和用户线程(User). 用户线程:我们平时所创建的都是用户线程. 守护线程:为用户线程提供服务. 任何线程都可以设置为守护线程和用户线程,通过方法 ...
- 一文带你全面了解MVC、MVP、MVVM模式(实例讲解)
前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC.MVP 与 MVVM ...
- 这是一份全面 清晰的架构设计指南:MVC、MVP MVVM模式(含实例讲解)
前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC.MVP 与 MVVM ...
- 实例讲解Linux系统中硬链接与软链接的创建
导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...
- java商品搜索功能_利用solr实现商品的搜索功能(实例讲解)
后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可 ...
- 实例讲解《Microsoft AJAX Library》(2):DomEvent类
引言: 大家都知道Ajax的之所以能如此丰富地实现,客户端脚本功不可没.而像Asp.Net Ajax这般庞大的工程,没有脚本类库的支撑是很难想象的.<Microsoft AJAX Library ...
- Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)
文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig 欢迎 star !!! 本来想着闲来无事,前面在项目中刚刚用到了工作流 Activit ...
- linux 命令 cd -p,Linux_实例讲解Linux中cd命令切换目录的使用技巧,cd命令大家再熟悉不过了,bash sh - phpStudy...
实例讲解Linux中cd命令切换目录的使用技巧 cd命令大家再熟悉不过了,bash shell经常会被用到的切换目录命令. 接下来我们直接通过万能的man来了解cd命令. 直接 man cd 是不行的 ...
最新文章
- https://www.zhihu.com/question/41564604
- 三、入门实例----基于注解
- MFC控件随窗口大小变化原理及实现
- 攻城时服务器维护,8月31日服务器维护更新公告
- C++ 继承关系图 01
- Linux Deepin 版本大全,Deepin下载-Deepin linuxv20.0 官方版下载-6188手游网
- mysql和springboot对照_SpringBoot(六) SpirngBoot与Mysql关系型数据库
- 46 CO配置-控制-利润中心会计-创建虚拟利润中心
- 研华数据采集卡如何采集压力信号转化为数字信号_厦门信号发生器-泰华仪表...
- docker 基础操作
- Java基础学习总结(141)——Cron 表达式使用再总结
- IIS下配置跨域设置Access-Control-Allow-Origin
- redis 配置文件配置
- 语音识别系统原理介绍---从gmm-hmm到dnn-hmm
- 万年历单片机课程设计百度文库_单片机课程设计电子万年历设计
- 计算机音乐谱大全极乐净土,极乐净土maria曲谱
- poj 1260 dp
- mysql left join和or_mysql – 在LEFT JOIN中使用带OR条件的索引
- 移动app需求分析与用例设计
- 大白菜 装系统 win7