从继承Child Class Object访问Parent Class虚方法

时间:2013-01-25 04:26:20

标签: c# oop inheritance

我想知道是否可以使用继承类(覆盖方法)对象来访问基本虚拟方法。

我知道这不是一个好习惯,但我想知道的原因是技术上是否可行。我没有遵循这样的做法,仅仅是出于好奇。

我确实看到了一些类似的问题,但我没有得到我正在寻找的答案。

示例:

public class Parent
{
    public virtual void Print()
    {
        Console.WriteLine("Print in Parent");
    }
}

public class Child : Parent
{
    public override void Print()
    {
        Console.WriteLine("Print in Child");
    }
}

class Program
{
    static void Main(string[] args)
    {
         Child c = new Child();
         //or Parent child = new Child(); 
         child.Print();  //Calls Child class method
         ((Parent)c).Print(); //Want Parent class method call
    }
}

请解释downvotes。 stackoverflow上任何现有类似问题(具有令人满意的答案)的链接都是可接受的答案。 感谢。

4 个答案:

答案 0 :(得分:4)

根据我评论的链接副本,您可以使用一些反射技巧来实现:

static void Main(string[] args)
{
    Child child = new Child();
    Action parentPrint = (Action)Activator.CreateInstance(typeof(Action), child, typeof(Parent).GetMethod("Print").MethodHandle.GetFunctionPointer());

    parentPrint.Invoke();
}

答案 1 :(得分:1)

Nope - 无法调用Base类的Virtual方法 - 在这种情况下调用该方法的派生程序最多。在您给出的示例中,它会在两种情况下都打印"Print in Child"

答案 2 :(得分:1)

据我所知,你能做的最好的事情是:

public class Parent
{
    public virtual void Print()
    {
        Console.WriteLine("Print in Parent");
    }
}

public class Child : Parent
{
    public override void Print()
    {
        base.Print();
        Console.WriteLine("Print in Child");
    }
}

class Program
{
    static void Main(string[] args)
    {
         Child c = new Child();
         //or Parent child = new Child(); 
         child.Print();  //Calls Child class method
         ((Parent)c).Print(); //Want Parent class method call
    }
}

答案 3 :(得分:0)

我不知道这什么时候会有所帮助。但是一个体面的解决方法可能是重载或写一个只调用父类的虚方法。它看起来像这样:

public class Child : Parent
{
    public void Print(bool onlyCallFather)
    {
    if(onlyCallFather)
        base.Print();
    else
        Print();
    }
}

然后在你的主要方法中:

class Program
{
    static void Main(string[] args)
    {
         Child c = new Child();
         child.Print(false);  //Calls Child class method
         child.Print(true);  //Calls only the one at father
    }
}

所以它会做你想做的事。我实际上已经看到了这种类型的解决方法来判断你是否想要调用基本方法。