5

継承クラス (メソッドをオーバーライドする) オブジェクトを使用して基本仮想メソッドにアクセスできるかどうかを知りたいです。

これは良い習慣ではないことはわかっていますが、これを知りたいのは、技術的に可能かどうかです。私はそのような慣習に従っていないので、好奇心から尋ねています。

同様の質問をいくつか見ましたが、探している答えが得られませんでした。

例:

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

4 に答える 4

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();
}
于 2013-06-03T20:20:48.630 に答える
1

いいえ - Base クラスの Virtual メソッドを呼び出すことはできません。このようなシナリオでは、メソッドの最も派生した実装が呼び出されます。"Print in Child"あなたが示した例では、両方のケースで印刷されます。

于 2013-01-25T04:50:24.623 に答える
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
    }
}
于 2013-01-25T05:09:27.580 に答える
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
    }
}

だから、あなたがやりたいことをするでしょう。基本メソッドを呼び出すかどうかを判断するために、このタイプの回避策を実際に見ました。

于 2013-06-03T19:47:01.217 に答える