new 与override(转)
首先,我引用《c#程序设计实用教程》中的一句话:"关键字new和override的区别:new修饰的方法表示显式隐藏基类继承的同名方法,不能够用基类的引用访问派生类的new方法;override表示重写基类的虚方法,可以用基类的引用指向派生类的重写方法。"
要理解这句话,你必须知道句子中的几个关键字:1.显式隐藏
2.用基类的引用访问派生类的new方法
3.重写
下面我来一一解释清楚,明白后,new和override的区别也就清楚了。
看两张图片,也许大家就会明白很多。
.....................................................................................................
大家比较一下,应该明白了第一个和第三个关键字的含义了吧
显示隐藏:new后,子类的method1()会同时和父类的method1()同时存在,但当使用子类的时候调用子类的method1()方法,而不会调用父类的method1(),后面我在详细解释一下什么时候调用父类的method1().
重写:override后,子类继承父类的method1(),并完全的改写此方法。
下面在解释一下“.用基类的引用访问派生类的new方法”,
public class animal
{
public virtual void sleep()
{
Console.WriteLine("animal all need sleep");
}
}
public class fish : animal
{
public override void sleep()
{
Console.WriteLine("fish sleeping with eye_open");
}
}
public class dog : animal
{
public override void sleep()
{
Console.WriteLine("dog sleeping with eye_closed");
}
}
那么现在我们可以在mian函数中执行下面的代码
animal fj1=new animal();
animal fj2=new fish();
animal fj3=new dog();
fj1.sleep();
fj2.sleep();
fj3.sleep();
输出:
animal all need sleep
fish sleeping with eye_open
dog sleeping with eye_closed
如果你用new取代override(这时候父类中就去掉关键字virtual),还是上面的代码:
输出结果:
animal all need sleep
animal all need sleep
animal all need sleep
主要是因为“animal fj1=new animal();”中用animal去实例化它的子类对象,在调用方法的时候它会调用父类的method1()方法,而不是调用子类的method1()方法。这也解决了前面的什么时候调用父类的method1()方法的问题。
有什么不对的地方,恳求指点。