想知道以下两者之间的区别:
案例1:基类
public void DoIt();
案例1:继承类
public new void DoIt();
案例2:基类
public virtual void DoIt();
案例2:继承类
public override void DoIt();
根据我运行的测试,情况1和2似乎具有相同的效果。有区别吗,或者有更好的方式吗?
想知道以下两者之间的区别:
案例1:基类
public void DoIt();
案例1:继承类
public new void DoIt();
案例2:基类
public virtual void DoIt();
案例2:继承类
public override void DoIt();
根据我运行的测试,情况1和2似乎具有相同的效果。有区别吗,或者有更好的方式吗?
当前回答
如果派生类中使用了关键字重写,则其重写父方法。
如果派生类中使用了关键字new,则派生方法被父方法隐藏。
其他回答
new:它只是隐藏基类的方法,但如果你想要访问它。
override:它覆盖了基类的方法,即使你想访问它也无法访问。
例子
using System;
public class Program
{
public static void Main()
{
BaseClass test = new DerivedClass();
var result = test.DoSomething();
Console.WriteLine(result);
}
class BaseClass
{
public string DoSomething()
{
return "Base result";
}
}
class DerivedClass : BaseClass
{
public new string DoSomething()
{
return "Derived result";
}
}
}
结果:基础结果
附注:我从下面的链接复制并稍微改变了上面的例子: https://stackoverflow.com/a/45822233/10995103
这些测试不会显示功能差异:
BaseClass bc = new BaseClass();
bc.DoIt();
DerivedClass dc = new DerivedClass();
dc.ShowIt();
在这个例子中,被调用的Doit就是您期望被调用的Doit。
为了看到区别,你必须这样做:
BaseClass obj = new DerivedClass();
obj.DoIt();
您将看到,如果您运行该测试,在情况1中(正如您定义的那样),调用BaseClass中的DoIt(),在情况2中(如您定义的那样),调用DerivedClass中的DoIt()。
如果派生类中使用了关键字重写,则其重写父方法。
如果派生类中使用了关键字new,则派生方法被父方法隐藏。
Virtual:表示该方法可以被继承者覆盖
Override:覆盖基类中虚方法的功能,提供不同的功能。
New:隐藏原来的方法(不一定是虚拟的),提供不同的功能。这应该只在绝对必要的情况下使用。
当您隐藏一个方法时,您仍然可以通过向上强制转换为基类来访问原始方法。这在某些情况下很有用,但也很危险。
我也有同样的问题,真的很困惑, 您应该考虑重写和new关键字只适用于类型为基类的对象和派生类的值的对象。在这种情况下,只有你会看到override和new的效果: 如果你有类A和类B, B继承自类A,然后你像这样实例化一个对象:
A a = new B();
现在,调用方法将考虑它的状态。 Override:意味着它扩展了方法的函数,然后在派生类中使用该方法,而new告诉编译器将该方法隐藏在派生类中,而在基类中使用该方法。 下面是关于这个主题的一个很好的观点:
https://msdn.microsoft.com/EN-US/library/ms173153%28v=VS.140,d=hv.2%29.aspx?f=255&MSPPError=-2147217396