方法重写和方法隐藏

本文关键字:方法 隐藏 重写 | 更新日期: 2023-09-27 17:57:02

可能的重复项:
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          
        }
    }

我有点困惑,但它使派生AppXmlLogReader的对象 但它调用基类的 Add() 方法和派生类的 WriteLog() 方法。

方法重写和方法隐藏

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

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

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

编辑:

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

(obj as DerivedAppXmlLogReaders).Add();