override:重写,用在子类方法前,表示子类方法重写基类方法的抽象实现或者虚实现。
new:用在子类方法前,表示该方法与基类完全独立,属于子类本身。
基类代码:
class VirtualClass
{
public virtual void VirtualMethod()
{
Console.WriteLine("farther's virtual method");
}
public void NotVirtualMethod()
{
Console.WriteLine("farther's method");
}
}
子类重写父类的虚方法(代码片段1):
class ChildClass:VirtualClass
{
public override void VirtualMethod()
{
Console.WriteLine("child's override method");
}
}
调用子类的VirtualMethod方法(代码片段2):
static void Main(string[] args)
{
ChildClass cl = new ChildClass();
cl.VirtualMethod();
VirtualClass vl = new ChildClass();
vl.VirtualMethod();
}
你会发现,就算子类转型为父类,调用的还是子类的方法。因为此时,子类重写了父类的方法。
程序结果如下所示。
new来了,改写前面的代码片段1
class ChildClass:VirtualClass
{
public new void VirtualMethod()
{
Console.WriteLine("child's override method");
}
}
使用代码片段2的调用代码,再次执行代码,结果如下:
很显然,两种调用方式执行结果不同。因为,子类的方法使用new声明后,子类与父类的VirtualMethod方法之间不存在任何关系,两方法属于不同的主体(子类和父类),所以分别调用的是子类和父类的VirtualMethod方法。
将new用于NotVirtualMethod方法前试试
这里的NotVirtualMethod方法为父类的非虚方法。
子类代码变为:
class ChildClass:VirtualClass
{
public new void NotVirtualMethod()
{
Console.WriteLine("child's new method");
}
}
调用代码变为:
static void Main(string[] args)
{
ChildClass cl = new ChildClass();
cl.NotVirtualMethod();
VirtualClass vl = new ChildClass();
vl.NotVirtualMethod();
}
执行结果为:
关于这个结果,不作分析。
所以,将基类的virtual方法或非virtual方法new过后,子类的方法与父类的方法都不存在任何关系。