方法覆盖和方法隐藏

时间:2013-02-01 09:41:07

标签: c# base derived-class

  

可能重复:
  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()方法。

2 个答案:

答案 0 :(得分:0)

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

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

编辑:

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

(obj as DerivedAppXmlLogReaders).Add();

答案 1 :(得分:0)

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