在工作中,我们很少遇到用new修饰方法的,实际上也不推荐使用,只是在某场景下不得已才去用它,下面做简单介绍
先看代码示例
internal class MyD
{
public void DoSth()
{
Console.WriteLine($"This is {nameof(MyD)}, {nameof(DoSth)}");
}
public virtual void V_Do()
{
Console.WriteLine($"This is {nameof(MyD)}, {nameof(V_Do)}");
}
}
internal class MyE: MyD
{
public new void DoSth()
{
Console.WriteLine($"This is {nameof(MyE)}, {nameof(DoSth)}");
}
public override void V_Do()
{
Console.WriteLine($"This is {nameof(MyE)}, {nameof(V_Do)}");
}
}
static void Main(string[] args)
{
MyD myD = new MyE();
myD.DoSth();
myD.V_Do();
Console.ReadKey();
}
运行结果如下:
我们可以看到,使用new修饰符修饰的非虚函数是静态绑定,这点使用时需要特别注意,它与虚函数的动态绑定不同。
使用new修饰符修饰方法的用途就是允许子类中出现方法声明和父类中方法声明相同的方法。
看下虚函数的设计原则:
程序的设计者如果把某个函数设置成虚函数,那相当于在制定契约,也就是告诉使用者:该类的派生类可能会以其他的方式来实现这个虚函数。
使用new修饰符修饰非虚函数的使用场景:
唯一的场景就是:新版的基类里面添加了一个和子类中已有的方法 重名的方法。而你项目中很多地方已经使用了那个子类的方法,改动起来特别麻烦。这时就用new修饰一下子类的重名方法。但是此时一定要注意new修饰的方法时静态绑定的。