不同之处在于:
new用于屏蔽父类的同签名方法。
而当子类强制转换为父类时,被屏蔽的父类方法依然有效。
即使子类new父类的一个virtual方法,强制转换为父类型时亦调用父类的方法。
即调用哪一个方法取决于编译的类型。
override用于重写父类virtual,abstract同签名方法,子类类型的对象调用该方法即用子类的重写方法,
父类类型对象调用该方法即用父类的方法,当子类类型的对象强制转换为父类类型对象时,调用的是子类的方法,
而不像new一样用的是父类方法,这就是说,调用哪一个virtual的方法是在运行时决定的。
例:
class A
{
public void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
public virtual void H()
{
Console.WriteLine("A.H");
}
}
class B:A
{
public new void F()
{
Console.WriteLine("B.F");
}
public new void G()
{
Console.WriteLine("B.G");
}
public override void H()
{
Console.WriteLine("B.H");
}
}
class program
{
static void main()
{
B b=new B();
b.F(); //输出B.F
b.G(); //输出B.G
b.H(); //输出B.H
((A)b).F(); //输出A.F
((A)b).G(); //输出A.G
((A)b).H(); //输出B.H
}
}
可见即使new用于virtual方法,依然不能实现类的多态性,必须要用override来实现多态性。new 是在子类中屏蔽父类方法,与是不是虚函数无关。