C# 中new,override的区别

最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅。在微软的一次笔试和面试中也提到了这个问题:

一、在C#中,new这个关键字使用频率非常高,主要有3个功能:

a)     作为运算符用来创建一个对象和调用构造函数。

b)     作为修饰符。

c)      用于在泛型声明中约束可能用作类型参数的参数的类型。

在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。

这里有个注意事项就是New和Override这两个关键字是互斥的。不可以同时使用。

二、 Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名, 此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方 法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

以下是一个小demo,展示了new和override的本质区别:

class Test

{

static void Main(string[] args)

{

Base ra = new classA();

Base rb = new classB();

ra.prinf();

rb.prinf();

}

}

abstract public class Base

{

public virtual void fuck()

{

Console.WriteLine ("fuck in Base");

}

}

public class A: Base

{

public override void fuck()

{

Console.WriteLine ("fuck in class A");

}

}

public class B: Base

{

public new void fuck()

{

Console.WriteLine ("fuck in class B");

}

}

输出结果:

fuck in calss A

fuck in class B

三、 Virtual 关 键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、 private、override一起使用。Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用 override或new关键字(new和override产生的机理不同)。

总结:

1.New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。比如,子类引用就调用子类的,父类引用就调用父类的。

2.Override主要用来对基类的方法和虚方法进行重写。无论是子类还是父类的引用,因为都指向子类对象,所以都是调用子类的成员。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-20 01:06:53

C# 中new,override的区别的相关文章

C++中overload,override,overwrite的区别详细解析

以下是对C++中overload,override,overwrite的区别进行了详细的分析介绍,需要的朋友可以过来参考下 Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载.(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同

c#中virtual, abstract和override的区别和用法

virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能够调用类A的method()方法,但不能更改方法体代码,但当类A中使用了virtual声明此方法: protected virtual void method(),那么类B可通过使用override重写此方法protected override void method(){ 新代码....;}vir

overload和override的区别(转)

overload和override的区别 override(重写) 1.方法名.参数.返回值相同.2.子类方法不能缩小父类方法的访问权限.3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常).4.存在于父类和子类之间.5.方法被定义为final不能被重写.overload(重载)1.参数类型.个数.顺序至少有一个不相同.  2.不能重载只有返回值不同的方法名.3.存在于父类和子类.同类中. overload和override的区别(转),布布扣,bubuko.com

Overload和Override的区别 C++ Java

Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载. 它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名.返回值.类型不能相同: 或者说可以改变参数.类型.返回值但是函数名字依然不变. Override:就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数, 当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了. 方法的重写Overriding和重载Overloading是Java多态

Overload 和Override 的区别

Overload 是重载的意思,Override 是覆盖的意思,也就是重写.重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同).重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现.子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常

redis中save和bgsave区别

转自:redis中save和bgsave区别 SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同: SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止.在主进程阻塞期间,服务器不能处理客户端的任何请求. BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成. Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求.

java中ArrayList 、LinkList区别

转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.LinkedList,但是最好的方式还是看源代码.其实ArrayList就是一个动态数组,LinkedList是一个链表.  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.     2.对于随机访问get和set,ArrayList优于LinkedLis

Http中Get/Post请求区别

Http中Get/Post请求区别 (1)get是从服务器上获取数据,post是向服务器传送数据. (1)   在客户端,Get方式在通过URL提交数据,数据在URL中可以看到:POST方式,数据放置在HTML HEADER内提交. (2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据. (2)   GET方式提交的数据最多只能有1024字节,而POST则没有此限制. (3)   安全性问题.正如

hadoop中Text类 与 java中String类的区别

hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.例如 unicode就是一个字符集,它的目标是涵盖世界上所有国家的文字和符号: 字符编码:是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对.即在符号集