Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法重写和方法隐藏_C#_Base_Derived Class - Fatal编程技术网

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();