c#-C#中override和new有什么区别?什么时候用new?

问题描述

C#中override和new有什么区别?什么时候用new?

C#中override和new有什么区别?什么时候用new?

解决方案

override允许我们通过派生一个类自定义基类代码中的一些行为。换言之,基类写好了,调用基类的代码也写好了,我们还希望定制一些代码,但是又不许其他程序员直接修改这些代码,那么可以用重写。
new是为了避免冲突而设计的,这种场合很罕见,但是存在。比如说派生类需要实现一个接口,不得不定义一个和基类重名的方法。

解决方案二:

 举例:
class A
{
    public virtual void o()
        {
            Console.WriteLine("ao");
        }
        public void n()
        {
            Console.WriteLine("an");
        }
}
class B : A
{
    public override void o()
        {
            Console.WriteLine("bo");
        }
        public new void n()
        {
            Console.WriteLine("bn");
        }
}
A a = new B();
a.o(); // bo
a.n(); // an
(a as B).n(); // bn

解决方案三:

override:派生类覆盖基类的方法,通过基类调用这个方法,调用的是派生类覆盖的。
new:派生类定义一个新的方法,通过基类调用这个方法,调用的是基类的。

解决方案四:

最好不要用new,除非你必须定义一个重名的方法,但是最好另外换个名字。

解决方案五:

?在C#中实现重写方法,可以用new和override两个关键字来实现,究竟他们之间有什么区别呢?下面,我以例子来说明他们之间的微妙区别:

public?class?GrandClass//基类
{
??????? public?GrandClass()
??????? {
??????????????? Console.WriteLine("In?GrandClass.Constructor");
??????? }
??????? public?virtual?void?Method()//用virtual才可以在子类中用override,而new不需要这样
??????? {
??????????????? Console.WriteLine("In?GrandClass.Method()");
??????? }
}

public?class?ParentClass:GrandClass//继承基类,看看override状态
{
????????public?ParentClass()
????????{
????????????????Console.WriteLine("In?ParentClass.Constructor");
????????}
????????public?override?void?Method()//使用override,是说把基类的方法重新定义
????????{
????????????????Console.WriteLine("In?ParentClass.Method()?use?override");
????????}
}

public?class?NewParentClass:GrandClass//继承基类,看看new状态
{
????????public?NewParentClass()
????????{
????????????????Console.WriteLine("In?NewParentClass.Constructor");
????????}
????????new?public?void?Method()//使用new,不是说用到基类的方法,而是重新定义一个子类方法,只不过,方法名称与基类相同
????????{
????????????????Console.WriteLine("In?NewParentClass.Method()");
????????}
}

  下面的调用代码:

static?void?Main()?
{
????????GrandClass?Parent=(GrandClass)new?ParentClass();//用override子类加框一个基类对象句柄
????????Parent.Method();
????????GrandClass?NewParent=(GrandClass)new?NewParentClass();//用new子类加框一个基类对象句柄
????????NewParent.Method();
????????NewParentClass?NewParent1=new?NewParentClass();//一个子类句柄
????????NewParent1.Method();
}

  结果是这样的:

[1]In?GrandClass.Constructor
[2]In?ParentClass.Constructor
[3]In?ParentClass.Method()?use?override

[4]In?GrandClass.Constructor
[5]In?NewParentClass.Constructor
[6]In?GrandClass.Method()

[7]In?GrandClass.Constructor
[8]In?NewParentClass.Constructor
[9]In?NewParentClass.Method()

  结果前的序号是我自己加的.为了以下的分析:
  [1],[2]两句是GrandClass?Parent=(GrandClass)new?ParentClass();的结果.(注意一下子类构建器与基类构建器的初始化顺序)
  [3]是Parent.Method();结果.
  [4],[5]两句是GrandClass?NewParent=(GrandClass)new?NewParentClass();的结果.
  [6]是NewParent.Method();的结果.
  [7],[8]两句是GrandClass?NewParent1=(GrandClass)new?NewParentClass();的结果.
  [9]是NewParent1.Method();的结果.

  这里我们可以看到,同样是用子类的对象构造一个基类句柄.结果却很明显,可以看到[3]和[6]的区别.[3]调用了子类的Method(),而[6]调用了基类的Method().
  这说明,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.
而这一例子的基础是建立在用子类对象加框成基类对象的,目的是实现用基类句柄调用子类方法,以实现重载的多形性.
  如果想调用子类的new方法,用子类的句柄(绝对不能用基类句柄)来调用.结果[9]可以看出来.
  用new是在为子类定义方法名时,实在没有办法定义方法名的情况才与基类的方法相同,但这个方法只在子类中起到作用,而不影响基类的方法.也就是说,new方法就是子类新定义的方法.用override是直正意义上的重载.??

解决方案六:

其实这个问题很好解决,你这样理解,override就是覆盖基类的方法,就是派生类根据自己的需要重写她的方法
而new就是把原来的方法隐藏,当我在派生类new了基类的方法后我还可以通过base去调用原来的基类方法

时间: 2024-09-11 00:30:51

c#-C#中override和new有什么区别?什么时候用new?的相关文章

重写-C#中override和abstract能否同时修饰方法/类

问题描述 C#中override和abstract能否同时修饰方法/类 在网上查发现有人说能 有人说不能 好疑惑 求大神们解疑 我是认可 不能同时修饰的 解决方案 这么用没有任何意义,因为你override就是为了重写基类的方法.你又是abstract,也就是你不打算重写. 换一句话说,这是没有任何意义的.因为你的派生类继承你这个类,那么自然就得到了这个类基类的方法. 除非你希望定义一个重名的,但是和它基类没有关系的方法,同时它是abstract的,那么你不应该用override而应该用new.

c#中override virtual static abstract sealed 的作用

c#中override virtual static abstract sealed 的作用 说明1: 表示静态的关键字 说明此对象在应用中只存在一份 说明2: C# 是面向对象的程序设计语言,每一个函数都属于一个类. 当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现.也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在.就像入口函数Static void Main,因为它是静态函数,所以可以直接被调用. 当一个方法被声

深入理解C#中new、override、virtual关键字的区别_C#教程

OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅. 一.在C#中,new这个关键字使用频率非常高,主要有3个功能:    a) 作为运算符用来创建一个对象和调用构造函数. b) 作为修饰符. c) 用于在泛型声明中约束可能用作类型参数的参数的类型. 在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使

Laravel模板引擎Blade中section的一些标签的区别介绍

 这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,本文讲解了@yield 与 @section.@show 与 @stop.@append 和 @override的区别,需要的朋友可以参考下     Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: 1.@yield 和 @section 都可以预定义可替代的区块,这两者有什

Android中home键和back键区别实例分析_Android

本文实例分析了Android中home键和back键区别.分享给大家供大家参考.具体如下: back键 Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activity,当此Activity又被其它Activity启动起来的时候,会重新调用OnCreate()方法进行创建,当栈中所有Activity都弹出结束后,应用也就随之结束了.如果说程序中存在service之类的,则可以在恰当的位置监听处理

MyBatis中关于resultType和resultMap的区别介绍_java

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值.

PHP中date与gmdate有什么区别?

  一.PHP中date与gmdate有什么区别? PHP中的时间有2个格式化函数:date()和gmdate(),在官方的文档中的描述为: date - 格式化一个本地时间/日期 gmdate - 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT). 举个例子,我们现在所在的时区是+8,那么服务器运行以下脚本返回的时间应该是这样的: 当前时间假定是2007-03-14 12:15:27 echo date('Y-m-d H:i:s', time()); 输出为:2007-

SQL中UNION 与 UNION ALL 的区别

区别 SQLServer2000中UNION与UNION ALL的区别 UNION 运算符: 将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行.这与使用联接组合两个表中的列不同. 使用 UNION 组合两个查询的结果集的两个基本规则是: 所有查询中的列数和列的顺序必须相同. 数据类型必须兼容.        这种多结果的查询组合为单一结果集在实际中应用的非常方便.但在应用中也有有着问题,如下实例可以进一步说明问题. 问题描述:        为了进一步分析与统计企

asp中get post提交表单区别

  asp教程中get post提交表单区别 Get和Post方式的区别有5点 1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程. 3. 对于get方式,服务器端用Request.QueryString获取变