C#中的overrid和new修饰符区别(代码)

在C#的继承中尝尝会用到相关的修饰词:override和new。这两个修饰符都可以在新的子类中,重写同名的父类方法。

override: 扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要使用到。

new:在用作声明修饰符时,new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。

以上是这两个修饰符的解释。对于这两者之间的区别之类的说法,其实网上找到的有很多,大多都是些概念性的东西。我这里主要是对于,自己测试的代码和大家分享下。

 1 using System;
 2
 3 public class BaseClass{
 4   public virtual void ShowA(){
 5     Console.WriteLine("A");
 6   }
 7
 8   public void ShowB(){
 9     Console.WriteLine("B");
10   }
11
12   public void ShowAB(){
13     ShowA();
14     ShowB();
15   }
16 }
17
18 public class TestClass:BaseClass{
19   public override void ShowA(){
20     Console.WriteLine("AA");
21   }
22
23   public new void ShowB(){
24     Console.WriteLine("BB");
25   }
26 }
27
28 public class Example
29 {
30     public static void Main()
31     {
32       TestClass test = new TestClass();
33       test.ShowA();
34       test.ShowB();
35       test.ShowAB();
36
37       BaseClass test1 = new TestClass();
38       test.ShowA();
39       test.ShowB();
40       test.ShowAB();
41
42       Console.ReadLine();
43       Console.WriteLine("运行结束");
44     }
45 }

输出结果如下:

可以看出,override相当于修改的父类的方法,对父类方法进行了重写。在父类方法中调用时,同样也是会调用到这个已经重写过得类。override重写的是父类地址下的方法实现信息。

对于new,对父类中的方法没有产生影响,当调用父类方法时,还是会执行父类的方法。调用子类方法时,则调用子类方法。只是方法的名字相同,从而造成了子类对父类的方法造成了一种隐藏的特性。new相当于重新开辟了新的方法实现位置,子类与父类方法的地址是不同的。

原文地址:https://www.cnblogs.com/yueye/p/8442445.html

时间: 2024-08-05 22:29:12

C#中的overrid和new修饰符区别(代码)的相关文章

C++中 容易忽视的const 修饰符

C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误!(如类型不匹配问题) (2)编译器处理方式不同.define宏是在预处理阶段展开,const常量是编译运行阶段使用. (3)存储方式不同.define宏仅仅是展开,有很多地方使用,就展开多少次,不会分配内存.const常量会在内存

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

java包,访问修饰符和代码块

包声明: package com.xxx.yyy 需要写在第一行 访问类,导包:import 包名.包名.类名 import java.util.Scanner import com.xxx.yyy.A; 访问修饰符:public,protected,default,private private: 只能在本类中使用 private int a=1; default: 在本类中和同包内使用 int b=2; protected: 在本类,本包和相关子类中使用 protected int c=3;

block 中使用__weak 和__strong修饰符的问题

在ARC环境下,我们常常会使用weak 的修饰符来修饰一个变量,防止其在block中被循环引用,但是有些特殊情况下,我们在block中又使用strong 来修饰这个在block外刚刚用__weak修饰的变量,为什么会有这样奇怪的写法呢? 后来上网查资料,给的解释就是下面的这段话: 在block中调用self会引起循环引用,但是在block中需要对weakSelf进行 strong,保证代码在执行到block中,self不会被释放,当block执行完后, 会自动释放该strongSelf: 对于程

解析Visual C# 7.2中的private protected访问修饰符

去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private protected访问修饰符(Access Modifier).至此,C#语言的访问修饰符有以下几种: private protected public internal internal protected private protected 既然有了private和protected,那么privat

vue中常用的事件和修饰符简单总结

1:阻止冒泡事件 JS事件流其中一种是冒泡事件,当一个元素被触发一个事件时,该目标元素的事件会优先被执行,然后向外传播到每个祖先元素,恰如水里的一个泡泡似的,从产生就一直往上浮,到在水平面时,它才消失.在这个过程中,如果你只希望事件发生在目标元素,而不想它传播到祖先元素上去,那么你需要在"泡泡"离开对象之前刺破它. 在vue中怎么写? 2:阻止默认行为 在vue中怎么写? 3:键盘事件 获取键码?通过事件对象来获取 注意:keydown事件和keyup事件的区别? keydown是在键

面向对象中的特殊的成员修饰符和几个特殊的方法

面向对象的成员修饰符 #Auther Bob #--*--conding:utf-8 --*-- # 成员修饰符 # 共有成员 # 私有成员 # 1.私有字段 # 私有的普通字段 # 私有的静态字段 # 2.私有方法 # 私有的方法 # 默认情况下,类的字段和方法都是共有的,通过对象和类就直接可以访问,但是如果我们在字段或者方法名字的前面加2个下划线,那么我们就不能在外部访问这些字段和方法,这些 # 方法和字段只能内部方法 class person(object): name = "diandi

Java 中的四种权限修饰符

* * private: * Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”. * 被其修饰的属性以及方法只能被该类的对象 访问,其子类不能访问,更不能允许跨包访问. * * default: * 即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”. * 该模式下,只允许在同一个包中进行访问. * * protected: * 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”. * 被其修饰的属性以及方法只能被类本身的方法及子

Java中的四种权限修饰符

权限修饰符   public protected [default] private 同一个类 YES YES YES YES 同一个包 YES YES YES NO 不同包子类 YES YES NO NO 不同包非子类 YES NO NO NO 注意:不写权限修饰符就代表“default” 原文地址:https://www.cnblogs.com/biggw/p/11783579.html