可能重复:
C#: new versus override
class BaseAppXmlLogReaders
{
public virtual void WriteLog() { }
public void Add()
{
}
}
class DerivedAppXmlLogReaders : BaseAppXmlLogReaders
{
public override void WriteLog()
{
}
public new void Add()
{ }
}
class Demo
{
public static void Main()
{
BaseAppXmlLogReaders obj = new DerivedAppXmlLogReaders();
obj.Add();//Call base class method
obj.WriteLog();//call derived class method
}
}
我有点混淆但是它成为DerivedAppXmlLogReaders的对象 但它调用基类的Add()方法和派生类的WriteLog()方法。
答案 0 :(得分:0)
这是因为你将其作为BaseAppXmlLogReaders
来处理。如果使用以下行,则将调用派生类的Add方法。
var obj = new DerivedAppXmlLogReaders(); // or DerivedAppXmlLogReaders obj = ...
编辑:
但是,您仍然可以通过这种方式调用派生类的方法:
(obj as DerivedAppXmlLogReaders).Add();
答案 1 :(得分:0)
如果您调用非虚方法,则在您的情况BaseAppXmlLogReaders
中将调用您持有该引用的类型的方法。如果您正在调用virtual
方法,则框架会将调用指向“正确”的重写方法。这就是为什么虚拟调用成本稍高的原因,以及为什么在99%的情况下使用new
是个坏主意。我还没有看到合理使用new
。