2013-09-23 144 views
1

下面提到的场景将以良好的方式清除情况。我愿意调用xDerived1类的虚拟方法。虽然我能够调用xBase类方法和xDerived2类方法。如何从另一个派生类对象调用派生类虚拟方法

((xDerived1)xDer2).myMethod(); // override void myMethod

请帮我一把。

static void Main(string[] args) 
     { 
      xDerived2 xDer2 = new xDerived2(); 
      xDer2.myMethod(); 
      ((xBase)xDer2).myMethod(); 
      ((xDerived1)xDer2).myMethod(); 
} 


public class xBase 
     { 
      public virtual void myMethod() 
      { 
       Console.WriteLine("virtual void myMethod"); 
      } 
     } 
    public class xDerived1 :xBase 
    { 
     public new virtual void myMethod() 
     { 
      Console.WriteLine("new virtual void myMethod"); 
     } 
    } 
    public class xDerived2 : xDerived1 
    { 
     public override void myMethod() 
     { 
      Console.WriteLine("override void myMethod"); 
     } 
    } 

回答

1

我得到了这个问题的解决方案,我们可以通过使用反射如下所述称之为:

xDerived2 child = new xDerived2(); 

      Action parentPrint = (Action)Activator.CreateInstance(typeof(Action), child, typeof(xDerived1).GetMethod("myMethod").MethodHandle.GetFunctionPointer()); 
      parentPrint.Invoke(); 
0

这是根本不可能调用xDerived1::myMethodxbase一个实例。 new关键字会导致定义新方法,因此xDerived::myMethodxbase::myMethod完全分离。为了调用该方法,您需要将其降至xDerived1

xbase local1 = ...; 
xDerived1 local2 = local1 as xDerived; 
if (local2 != null) { 
    local2.myMethod(); 
} 
+0

我想符合:因为myMethod的()在xDerived2被覆盖,并且它是虚拟的在xDerived1中,假设不使用'new'关键字,是否可以调用xDerived1 :: myMethod()? – Zeeshan