簡體   English   中英

從繼承Child Class Object訪問Parent Class虛方法

[英]Access Parent Class virtual method from inheriting Child Class Object

我想知道是否可以使用繼承類(覆蓋方法)對象來訪問基本虛方法。

我知道這不是一個好習慣,但我想知道的原因是技術上是否可行。 我不遵循這樣的做法,只是出於好奇而提出要求。

我確實看到了一些類似的問題,但我沒有得到我正在尋找的答案。

例:

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上任何現有類似問題(具有令人滿意的答案)的鏈接都是可接受的答案。 謝謝。

根據我評論的鏈接副本,您可以使用一些反射技巧來做到這一點:

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

不 - 不可能調用Base類的Virtual方法 - 在這種情況下調用該方法的派生程序最多。 在您給出的示例中,它將在兩種情況下打印"Print in Child"打印"Print in Child"

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

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
    }
}

我不知道什么時候會有所幫助。 但是一個體面的解決方法可能是重載或寫一個只調用父類的虛方法。 它看起來像這樣:

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
    }
}

所以它會做你想做的事。 我實際上已經看到了這種類型的解決方法,以告訴您是否要調用基本方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM