[C#]关于override和new在重写方法时的区别
规则:
- 在“运行时”遇到虚方法时,对象会调用虚成员派生得最远的、重写的实现。
- 如果是用new修饰符实现的方法,它会在基类面前隐藏派生类重新声明的成员,这时候会找到使用new修饰符的成员之前的成员,然后调用它。
- 一定要显式地使用override关键字来重写方法,如果没有使用override,也没有使用new,则会默认使用new。
例子:
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
class A { public void Test() { Console.WriteLine("A"); } }
class B : A { public virtual void Test() { Console.WriteLine("B"); } }
class C : B { public override void Test() { Console.WriteLine("C"); } }
class D : C { public new void Test() { Console.WriteLine("D"); } }
class Program
{
static void Main()
{
D d = new D();
C c = d;
B b = d;
A a = d;
d.Test();
c.Test();
b.Test();
a.Test();
}
}
}
最后的输出结果为:
D C C A(省略回车)
分析:
- 第一个D:没有派生类,所以没有重载。
- 第二个C:有派生类,但是使用了new修饰符对基类隐藏了重写的方法。
- 第三个C:有派生类,并且使用override修饰,这是它寻找到最远的派生的成员,因此输出了C。
- 第四个A:A的方法非虚,因此输出的是A。
[C#]关于override和new在重写方法时的区别的更多相关文章
- Android Studio 重写方法时参数命名异常
Android Studio 重写方法时参数命名异常 Android Studio 重写方法时参数名称乱掉可以通过下载相应源码解决
- “全栈2019”Java异常第十一章:重写方法时只能抛出父类异常子集
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- Java继承,重写方法时改变方法的访问权限
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- 解决 Eclipse 重写方法时参数为arg0,arg1
我们在用eclipse 中Alt+ / 补全代码时.方法重写会出现arg0这样可读性差的参数. 原因是没有找到android 的源文件. 一.下载文件 需要下载 sources for android ...
- 方法的重写与重载的区别(Override与Overload)。重载的方法是否可以改变返回值的类型
方法的重写(Override)与重载(Overload)的区别.重载的方法是否可以改变返回值的类型?[基础] 解释: 方法的重写overriding和重载Overloading是Java多态性的不同表 ...
- “全栈2019”Java第四十八章:重写方法Override
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- java方法调用之动态调用多态(重写override)的实现原理——方法表(三)
上两篇篇博文讨论了java的重载(overload)与重写(override).静态分派与动态分派.这篇博文讨论下动态分派的实现方法,即多态override的实现原理. java方法调用之重载.重写的 ...
- 转: Delphi的OverRide、OverLoad和Virtual方法
http://blog.csdn.net/ckli/article/details/2201418 override 重写 也叫覆盖 .方法的重写Overriding和重载Overloading是Ja ...
- 重写equals()方法时,需要同时重写hashCode()方法
package com.wangzhu.map; import java.util.HashMap; /** * hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,<br/&g ...
- c#中的重写方法与隐藏方
1.父类中有方法a,添加virtua修饰符可声明为虚方法,在子类中可以用override声明后重写方法a. 2.父类中有方法a,在子类中可以有new修饰符声明后隐藏父类方法. 子类重写方法后,对于子类 ...
随机推荐
- 成功 解决 @keyup.enter=“search()“ 在el-input 组件中不生效的问题
1.问题描述 在输入框中.输入内容.点击回车.没有效果 问题代码 2.问题解决思路 查看官网的解释说明: 要使用.native修饰符 3.问题解决 修改后的代码 修改后的效果
- 二、Celery执行一步任务
二.Celery执行异步任务 2.1.基本使用 创建项目celerypro 创建异步任务执行文件celery_task: import celery import time backend='redi ...
- vue-axios删除操作
<template> <div class="nav"> <input v-model="location" type=" ...
- @confirguration(proxyBeanMethods = false)的作用,如何选择Full模式和Lite模式
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件 public class MyConfig { @Bean ...
- 抓包分析 TCP 握手和挥手
前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...
- android_studio 使用
android studio安装 目前使用: android studio 4.1.3 Zip免安装版:android-studio-ide-201.7199119-windows413.zip an ...
- 介绍一个jmeter录制脚本谷歌插件 —— metersphere-chrome-plugin
该插件可将用户在浏览器操作时的 HTTP 请求记录下来并生成 JMX 文件(JMeter 脚本文件). 1. 插件解压 插件下载链接: https://pan.baidu.com/s/14nGb_s9 ...
- Go语言核心36讲32
你好,我是郝林,今天我们继续分享原子操作的内容. 我们接着上一篇文章的内容继续聊,上一篇我们提到了,sync/atomic包中的函数可以做的原子操作有:加法(add).比较并交换(compare an ...
- HDLBits答案——Verification: Writing Testbenches
1 clock module top_module ( ); reg clk; dut U1(.clk(clk)); initial begin clk = 0; end always begin # ...
- devexpress中dockManager保存布局后恢复不正常
在使用dockManager保存布局后进行恢复发现不正常,与中间的gridcontorl接触的都不行.gridcontorl设置的填充是fill 所以在在界面上再添加一个PanelControl控件并 ...