接上面讲

我们知道虚方法,和重写方法。

但是有没有发现 override和new的作用是差不多的。

但为什么还要单独写出来两个呢?

首先,咱们要明白一个问题,继承是具有线性传播的。

 class Father
{
public int Money => ; public void Comany() => Console.WriteLine("公司年年都赚钱!!!!");
} class Son : Father
{
public Son() => Console.WriteLine($"我继承了我爸的{Money}"); public new void Comany() => Console.WriteLine("我不喜欢这个公司"); }

代码中,Son具有Father的方法,属性。换句话 Son使用的Father的方法。在Son的这个继承链上,使用new来隐藏Father的成员/方法。 但也仅仅是隐藏。 并不代表不存在。

来看实例代码:

            new Son().Comany();//实例化 Son 并使用方法

            Father father = new Son();//父类通过子类实例化

            father.Comany();//父类实现方法

            Son son = new Son();//实例化子类

            (son as Father).Comany();//强转父类,并实现方法

结果

话句话说,new关键字仅仅是在子类中的方法隐藏,就是单纯的 我不想在子类中使用使用父类的方法。 但是不代表父类的方法就消失了。 子类依旧是有办法能够使用父类的方法

最简单的证明就是在使用new关键字,在方法内使用base来实现父类的方法。 依旧是管用。

代码:

....省略
class Son : Father
{
public Son() => Console.WriteLine($"我继承了我爸的{Money}和公司"); public new void Comany() => base.Comany(); }
static void Main(string[] args)
{
new Son().Comany();//实例化 Son 并使用方法 Father father = new Son();//父类通过子类实例化 father.Comany();//父类实现方法 Son son = new Son();//实例化子类 (son as Father).Comany();//强转父类,并实现方法 }

那么 override呢?

现阶段能够使用的override就只能配合virtual关键字。 那么override是怎么回事呢?

相对new,override是彻底的覆写。包父类的方法。

看代码:

   class Program
{
static void Main(string[] args)
{
new Son().Comany();//实例化 Son 并使用方法 Father father = new Son();//父类通过子类实例化 father.Comany();//父类实现方法 Son son = new Son();//实例化子类 (son as Father).Comany();//强转父类,并实现方法 ReadKey();
}
}
class Father
{
public int Money => ; public virtual void Comany() => Console.WriteLine("公司年年都赚钱!!!!");
} class Son : Father
{
public Son() => Console.WriteLine($"我继承了我爸的{Money}和公司"); public override void Comany() => Console.WriteLine("我不喜欢这个公司"); }

结果:

看见没,连父类的方法都给你整没了。只要你不是单纯的使用父类,如果是通过子类来实现父类的方法而且还是override那基本就是不可能的事情了。

override就是在继承链上彻底抹杀virtual的方法的存在。

如果virtual和new进行搭配呢?直接参考第一种方式。

C# 多态(2)的更多相关文章

  1. Java中的多态

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...

  2. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  3. C#非常重要基础之多态

    前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...

  4. C++多态详解

    多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...

  5. 【那些年关于java多态应用】

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...

  6. JAVA多态

    多态是指当系统A访问系统B的服务时,系统B可以通过多种方式来提供服务,而这一切对系统A是透明的.比如动物园的饲养员能够给各种各样的动物喂食.下图显示了饲养员Feeder,食物Food和动物Animal ...

  7. C#多态“说来也说”——逻辑层BLL中的多态使用

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/5861842.html 昨天晚上,有个朋友说学了好久,依然没搞 ...

  8. java多态的理解

    面向对象语言中的类有三个特征,封装.继承.多态.封装与继承很好理解,那什么是多态呢? 1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同 ...

  9. java中如何实现多态

    复习基础知识 多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短 ...

  10. OC多态

    要点: 1.多种形态,引用的多种形态对于一个引用变量,可以指向任何类的对象.对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同.当通过此引用向对象发送消息,调 ...

随机推荐

  1. mybatis foreach标签的解释 与常用之处

    情景:查询数据库中文章的相关文章   文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...

  2. Linux学习笔记 -- 目录与文件的管理

    目录结构 Linux的目录结构为树状结构,最顶级的目录为根目录 “/”. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什么是. 绝对路径与相对路径 绝 ...

  3. SQL Server2005中文版x64安装29506错误解决办法

    在使用SQL Server 2005简体中版安装时,使用X86(32位操作系统下)安装没有出现任何问题.可是在X64(64位操作系统下)安装过程没有出现问题,可是安装完成后却没有Microsoft S ...

  4. VS2017中的附加到进程

    vs2017 里加入了IIS Express,所以在web项目执行的时候,在附加进程中找不到端口号了,只能找到PID 但是浏览器的地址栏里还是带有端口的地址:http://localhost:1351 ...

  5. 不同浏览器对于html5 audio标签和音频格式的兼容性

    音频格式 Chrome Firefox IE9 Opera Safari OGG 支持 支持 支持 支持 不支持 MP3 支持 不支持 支持 不支持 支持 WAV 不支持 支持 不支持 支持 不支持 ...

  6. sublime3环境配置

    首先安装package control 按ctrl+`调出控制台,输入以下代码 import urllib.request,os; pf = 'Package Control.sublime-pack ...

  7. Three.js会飞走飞回来的鸟

    效果图 demo import './index.css'; // stats var stats; (function(){ stats = new Stats(); document.body.a ...

  8. 黑客工具包ShadowBrokers浅析

    臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers 在 steemit.com博客上提供了相关消息. 本次被公开的工具包大小为117.9MB,包含23 个黑客工具,其中部分文件显示 ...

  9. libevent源码深度剖析五

    libevent源码深度剖析五 ——libevent的核心:事件event 张亮 对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的 ...

  10. LoadRunner 脚本开发和常用函数

    开发性能测试脚本原则.简单 正确 高效 在lr中,脚本运行是解释执行的.所以在运行时,需要先编译. 局部变量和全局变量 1.在init.action.end中定义的变量就是局部变量 2.在global ...