【问题标题】:How to call derived class virtual method from another derived class object如何从另一个派生类对象调用派生类虚方法
【发布时间】:2013-09-28 09:49:19
【问题描述】:

下面提到的场景将很好地清除情况。我愿意调用 xDerived1 类的虚方法。虽然我可以调用 xBase 类方法和 xDerived2 类方法。

((xDerived1)xDer2).myMethod(); //覆盖 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");
        }
    }

【问题讨论】:

    标签: c# oop virtual


    【解决方案1】:

    我得到了这个问题的解决方案,我们可以使用反射来调用它,如下所述:

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

    【讨论】:

      【解决方案2】:

      根本不可能从xbase 的实例调用xDerived1::myMethodnew 关键字导致定义一个新方法,因此xDerived::myMethodxbase::myMethod 完全分离。为了调用该方法,您需要将其转换为xDerived1

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

      【讨论】:

      • 我想符合:因为 myMethod() 在 xDerived2 中被覆盖,并且它在 xDerived1 中是虚拟的,假设没有使用 'new' 关键字,是否可以调用 xDerived1::myMethod() ?
      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2012-03-05
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多