http://www.javashuo.com/article/p-mkcfeise-bw.htmlhtml
C#中new和override是继承中常常用到的两个关键字,可是每每有时候容易把这两个关键字的做用搞混淆。ide
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!"); } }
意思也就是 子类使用new 重写方法后 父类 A=new 子类(); 则站在A的角度调用到的是 A.Method() 而调用不到B.Method(),而当 子类 B=new 子类(); 则调用B.Method(),而调用不到父类A的Method()。(固然 new 和override的子类中均可以用base 调用父类的Method())。 总结通俗的讲:new:父类看不到子类的new的新方法,子类看不到父类被new的方法, 而override: 父类和子类看到的都是子类override后的方法。 对于上面这个例子来讲,假如运行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函数
C#中override关键字表示重写,对于加上override关键字的属性或函数将彻底覆盖基类的同名虚属性或虚函数,使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)。code
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
接口在相互继承的时候也会隐藏基接口的同名属性或函数,可是对于接口来讲很特殊,隐藏对于基接口来讲是不起做用的,接口内部的属性和函数都只是声明,它们都指向实现接口的类中的同名实现函数,经过接口调用接口的属性和函数的时候都会去调用实现类中从上到下最早可见的同名函数和同名属性:
public interface IA { void Method(); } public interface IB : IA { new void Method(); } public class IClass:IB { public void Method() { Console.WriteLine("This Method in Class IClass!"); } } public class ISubClass : IClass { public new void Method() { Console.WriteLine("This Method in Class ISubClass!"); } } IA ia = new ISubClass();ia.Method();输出This Method in Class IClass!由于对于ia来讲在继承链中最早见到的同名实现函数是类IClass的Method函数
把上面的例子稍做修改:htm
public interface IA { void Method(); } public interface IB : IA { new void Method(); } public class IClass:IB { public virtual void Method() { Console.WriteLine("This Method in Class IClass!"); } } public class ISubClass : IClass { public override void Method() { Console.WriteLine("This Method in Class ISubClass!"); } } IA ia = new ISubClass();ia.Method();输出This Method in Class ISubClass!由于继承链中的Method函数都被ISubClass的Method覆盖了,因此对于ia来讲在继承链中最早见到的同名实现函数是类ISubClass的Method函数