C#中new和override是继承中经常用到的两个关键字,但是往往有时候容易把这两个关键字的作用搞混淆。

new

C# new关键字表示隐藏,是指加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数

public class A
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class A!");
    }
} public class B : A
{
    public new void Method()
    {
        Console.WriteLine("This Method in Class B!");
    }
}

对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class A!,这是因为class B继承于class A,现在B中的Method函数隐藏A中的Method,所以从B(包括继承于B的子类)的角度来看类中的Method就是B.Method,A的Method不可见,但是如果从A的角度来看B,A只认识类B中继承于类A的Method函数,对于B类中的Method它不可见,所以A a=new B();a.Method();相当于是调用了类B中继承于A的Method函数

override

C#中override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数,使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)。

public class A
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class A!");
    }
} public class B : A
{
    public override void Method()
    {
        Console.WriteLine("This Method in Class B!");
    }
}

对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class B!,因为class B的Method函数完全覆盖基类的同名虚函数Method,使整个继承链中看见的Method函数都是B中的Method,所以就算是以A角度来看B,A看到的Method函数也是B中的Method,因为A中的Method完全被B的覆盖了

但是如果要在B的对象中调用A的Method函数还是有办法,就是使用base关键字,比如

public class A
{
    public virtual void Method()
    {
        Console.WriteLine("This Method in Class A!");
    }
} public class B : A
{
    public override void Method()
    {
        base.Method();
    }
}

A a=new B();a.Method();会输出This Method in Class A!,base.Method();表示调用类B中继承于基类A的Method

new、override与interface

接口在相互继承的时候也会隐藏基接口的同名属性或函数,但是对于接口来说很特殊,隐藏对于基接口来说是不起作用的,接口内部的属性和函数都只是声明,它们都指向实现接口的类中的同名实现函数,通过接口调用接口的属性和函数的时候都会去调用实现类中从上到下最先可见的同名函数和同名属性:

转载出处:红黑联盟

浅析C# new和override的区别的更多相关文章

  1. C# new和override的区别

    浅析C# new和override的区别 C#中new和override是继承中经常用到的两个关键字,但是往往有时候容易把这两个关键字的作用搞混淆. new C# new关键字表示隐藏,是指加上new ...

  2. overload和override的区别(转)

    overload和override的区别 override(重写) 1.方法名.参数.返回值相同.2.子类方法不能缩小父类方法的访问权限.3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出 ...

  3. C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序

    关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...

  4. 【转】overload与override的区别

    [转]overload与override的区别 override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子 ...

  5. Overload和Override的区别?

    Overload和Override的区别? Override是重写:方法名称.参数个数,类型,顺序,返回值类型都是必须和父类方法一致的.它的关系是父子关系Overload是重载:方法名称不变,其余的都 ...

  6. Overload和Override的区别 C++ Java

    Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载. 它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名.返回值.类型不能相同: 或者说可以改变参数 ...

  7. Java overload和override的区别分析

    Java overload和override的区别分析 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性 ...

  8. 【C#】什么时候使用virtual什么时候使用abstract,(另附override/new区别)

    一.C#中virtual与abstract的区别(引用“姓吕名布字子乔”的文章) C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新定义,覆盖父类的定义 ...

  9. 浅谈Overload和Override的区别

    如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Over ...

随机推荐

  1. img加载在IE11,chrome,FF下的不同

    IE11 img.complete 得不到img的大小,会使用img.onload chrome,ff:img.complete 得不到img的大小,会使用自己创建的img加载方法

  2. 如何让jboss eap 6.2+ 的多个war应用共享 jar 包?

    weblogic有一个很贴心的功能,允许把多个war应用共同依赖的jar包,打包一个单独的war,以libary方式部署,然后各应用在weblogic.xml里声明引用该libary即可,这样可大大减 ...

  3. PAT 1067. Sort with Swap(0,*)

    1067. Sort with Swap(0,*) (25)   Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy ...

  4. 【Flex】正则表达式

    1.基本语法 . 匹配除换行符"\n"外的任意单个字符. * 匹配前面Flex正则表达式的零次或多次出现.eg:Alert.show("ThisBookIsGoodBoo ...

  5. JavaScript高级程序设计笔记 事件冒泡和事件捕获

    1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> & ...

  6. 项目分享一:在项目中使用 IScroll 所碰到的那些坑

    最近做了个 WEB APP 项目,用到了大名鼎鼎的 IScroll,滚动的效果的确很赞,但是坑也是特别多,下面总结一下,希望自后来者有帮助. 该项目现已开源在 github 上,https://git ...

  7. gravity、layout_gravity及orientation

    gravity.layout_gravity及orientation 最近在弄一个简单的界面:横向,添加一张准备好的背景图,在界面右边居中放置一个按钮.实现过程中发现对布局的主要属性没有想象中地那么熟 ...

  8. c#类库和可移值类库的区别

    所谓类库,只能指定一个类库的可运行平台. 而可移值类库,可以在无需修改代码的情况,同时可以在多平台上运行DLL文件.多平台如NET Framework.Silverlight.Windows Phon ...

  9. 【转】Java 8十个lambda表达式案例

    1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnable() { @Override public ...

  10. mybatis字符串模糊匹配

    1.  参数中直接加入%%,注意不需要加两个单引号,加了就会出错,因为系统会自动为字符串类型加上两个单引号 <select id="selectPersons" result ...