2013-02-01 54 views
-2

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

究竟是什么问题? – Tikkes

+3

是的,你已经重写了'WriteLog'并且隐藏了'Add'(以非多态的方式)。 –

+0

@Tikkes我创建派生类的对象,但它调用基类方法 – John

回答

0

这是因为你把它当作BaseAppXmlLogReaders。如果使用以下行,则将调用派生类的Add方法。

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

编辑:

但是,你仍然可以调用派生类的这样的方法:

(obj as DerivedAppXmlLogReaders).Add(); 
+0

classBase obj = new classDerived();意味着被贬斥的类的对象创建我对新的任何类infront然后创建该类的对象 – John

+0

我知道,但dervived类的成员将被隐藏。 – laszlokiss88

+0

为什么...我没有得到请详细说明 – John

0

如果你调用非虚方法,该类型的方法你是一个参考将被称为,在你的情况下BaseAppXmlLogReaders。如果您正在调用virtual方法,框架会将该调用指向“正确”,被重写的方法。这就是为什么虚拟电话费用更低,为什么在99%的情况下,使用new是个好主意。我还没有看到new的合理使用。

+0

classBase obj = new classDerived();意味着被创造的类的对象创建了我对新的任何类infront创建该类的对象 – John

+0

是的,但是,正如我所说的,非虚拟方法将指向classBase方法。这是一个事实,这是'新'的工作原理。 'Virtual'告诉运行时检查实际实例中是否有重写的方法,'new'方法被忽略,因为基本方法不是'virtual'。关于类的'''''''密码'关键字会告诉运行时它不必检查重写的方法,因为不会有任何内容。如果你能控制基类,不要使用'new'。 – Jobo