-2

可能重复:
C#:新建与覆盖

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() 方法。

4

2 回答 2

0

如果您调用非虚拟方法,则在您的情况下,将调用您持有引用的类型的方法BaseAppXmlLogReaders。如果您正在调用一个virtual方法,框架会将调用指向“正确”的、被覆盖的方法。这就是为什么虚拟呼叫成本略高的原因,以及为什么在 99% 的情况下使用它是个坏主意new。我还没有看到合理使用new.

于 2013-02-01T09:49:44.460 回答
0

这是因为您将其处理为BaseAppXmlLogReaders. 如果您使用以下行,您将调用派生类的 Add 方法。

var obj = new DerivedAppXmlLogReaders(); // or DerivedAppXmlLogReaders obj = ...

编辑:

但是,您仍然可以通过这种方式调用派生类的方法:

(obj as DerivedAppXmlLogReaders).Add();
于 2013-02-01T09:44:47.293 回答