C# 方法重写和方法隐藏
可能重复:C# 方法重写和方法隐藏,c#,base,derived-class,C#,Base,Derived Class,可能重复: 我有点困惑,但它使DerivedAppXmlLogReaders成为对象 但它调用基类的Add()方法和派生类的WriteLog()方法。这是因为您将其作为BaseAppXmlLogReaders处理。如果使用以下行,将调用派生类的Add方法 var obj = new DerivedAppXmlLogReaders(); // or DerivedAppXmlLogReaders obj = ... 编辑: 但是,您仍然可以通过以下方式调用派生类的方法: (obj as Der
我有点困惑,但它使DerivedAppXmlLogReaders成为对象
但它调用基类的Add()方法和派生类的WriteLog()方法。这是因为您将其作为
BaseAppXmlLogReaders处理。如果使用以下行,将调用派生类的Add方法
var obj = new DerivedAppXmlLogReaders(); // or DerivedAppXmlLogReaders obj = ...
编辑:
但是,您仍然可以通过以下方式调用派生类的方法:
(obj as DerivedAppXmlLogReaders).Add();
如果调用非虚方法,则将调用持有引用的类型的方法,在您的示例中是BaseAppXmlLogReaders
。如果您正在调用virtual
方法,框架将把调用指向“correct”(正确的)重写方法。这就是为什么虚拟调用的成本稍微高一点,以及为什么在99%的情况下,使用new
是个坏主意。我还没有看到new
的合理使用,问题到底是什么?是的,您已经覆盖了WriteLog
,只是隐藏了Add
(以非多态方式)@Tikkes我正在创建派生类的对象,但它调用基类方法@Jon如果我从派生类方法中删除新关键字,它将再次调用基类方法..classBase obj=new classDerived();意思是创建了dervied类的对象我是对的,新的前面的任何类都会创建该类的对象我知道,但是dervied类的成员将被隐藏。为什么…我不明白,因为它是这样工作的。Add方法不是虚拟的,因此将对保存对象引用的类型(在您的示例中是BaseAppXmlLogReaders)调用它;表示创建的dervied类的对象我是对的,无论new前面的类创建该类的对象是什么,但是,正如我所说的,非虚方法将指向classBase方法。这是事实,new
就是这样工作的Virtual
告诉运行时检查实际实例中是否存在重写的方法,新的
方法被忽略,因为基本方法不是Virtual
。类上的sealed
关键字将告诉运行时它不必检查重写的方法,因为不可能有任何方法。如果您可以控制基类,请不要使用new
。
(obj as DerivedAppXmlLogReaders).Add();