override :是指“覆盖”,是指子类覆盖了父类中被virtual的方法。
new : 是指“隐藏”,是指子类隐藏了父类的方法()。new除了可以创建对象,以及作为泛型约束之外,还可以作为方法的修饰符,这里讨论的是作为方法的修饰符时与override的异同。
public class Base
{
public virtual void Method1()
{
Console.WriteLine("Base's virtual function Method1");
}
public virtual void Method2()
{
Console.WriteLine("Base's virtual fucntion Method2");
}
}
public class Derived : Base
{
public override void Method1()
{
Console.WriteLine("Derived's override function Method1");
}
public new void Method2()
{
Console.WriteLine("Derived's new function Method2");
}
}
Derived继承了Base,在Derived中,Method1重写了基类的Method1,Method2隐藏了基类的Method2。
单纯地var baseClass = new Base();或var derived = new Derived();调用的是各自的方法,这点不用讨论了。
当Base baseClass= new Derived();时,这里发生了一次向上转型,baseClass从Derived转型为其父类Base类型。实例baseClass.Method1调用的将是Derived.Method1的方法,因为在实例化的时候Method1已经被重写(override)过了。而baseClass.Method2调用的将是Base.Method2,因为baseClass.Method2没有被影响到,依然是Base.Method2。
Base baseClass = new Derived();
baseClass.Method1();
baseClass.Method2();
输出结果:
Derived's override function Method1
Base's virtual fucntion Method2
总结:override会覆盖基类的方法,从而实现面向对象的多态特性。new不会影响基类,与多态无关。