继承类中new关键字与override的区别
public abstract class A { public A() { Console.WriteLine('A'); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B : A { public B() { Console.WriteLine('B'); } //public new void Fun() //注意这里是new 关键字 而不是override public override void Fun() //当关键字为 override的时候 将B的实例赋给A的时候 输出应该为B的Fun()函数 { Console.WriteLine("B.Fun()"); } } class Program { static void Main(string[] args) { A a = new B(); //由于派生类B 使用了new关键字来改写基类A里的方法 /* * 为什么输出结果为 A B A.FUN()? * * 一:为什么输出为A B * 首先输出A B 因为子类的任何构造函数 都会先调用执行父类的默认构造函数 * 所以当创建B的实例时候, 程序先运行到B的构造函数处 然后检测是否有父类A的构造函数A() 如果有,立刻跳转到父类A处 并优先执行A() 然后再执行本身的构造函数 * * 二:为什么输出为A.Fun() 而不是 B.Fun()? * 虽然派生子类B 也实现了 Fun()方法 但是子类B使用的是new关键字 而不是重写override */ a.Fun(); //输出结果为 A B A.FUN() Console.Read(); } }
作者:SilverSky(SoFlash)
出处:http://www.cnblogs.com/longwu/
欢迎学习和转载,转载请注明出处.
浙公网安备 33010602011771号