1

base.virtualParentMethod() を使用して、親クラスのメソッドを呼び出すことができます。しかし、次のシナリオでは、オブジェクトを作成せずに親子クラスでメソッドを呼び出すにはどうすればよいですか。

 class A
    {
        public virtual void virtualParentMethod()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public override void virtualParentMethod()
        {
            Console.WriteLine("B");
        }
    }
    class C : B
    {
        public override void virtualParentMethod()
        {
            //base.virtualParentMethod();
            //This is where I want to invoke the method of A
            //So that out Will be : A
        }
    }
4

5 に答える 5

4

親の直接の子ではない親機能が必要な場合は、その機能を別のメソッドに移動する必要があります。

class A
{
    public virtual void VirtualParentMethod()
    {
        Foo();
    }

    protected void Foo()
    {
        Console.WriteLine("A");
    }
}
class B : A
{
    public override void VirtualParentMethod()
    {
        Console.WriteLine("B");
    }
}
class C : B
{
    public override void VirtualParentMethod()
    {        
        Foo();
    }
}

アップデート

次の点も考慮してください。

  • Cから直接継承するA
  • 継承順序の変更、つまりBfromC
  • この動作を他のオブジェクトに抽出する
于 2012-04-16T12:18:20.773 に答える
2

base構文を使用して実行する派生メソッドのバージョンを選択することはできません。特定のメソッドを実行する唯一の方法は、そのメソッドに使用できるバージョンのAinsideをインスタンス化することです (基本的に、の実際のインスタンス)。CA

しかし、私は個人的にこれをしません。これは、継承チェーンの設計上の問題を示しています。

Cを確実に実行する必要がある場合は、 - からA継承しないでください。ACC : A

于 2012-04-16T12:14:26.197 に答える
0

Cのインスタンスを(C:B、B:Aとして)作成することにより、すでにAのインスタンスを作成しているので、小さな変更を加えてこれを行う方法があります。さて、これが良い考えであるかどうかを示すことなく、

派生メソッドの実装でオーバーライドする代わりに「new」キーワードを使用する場合は、オブジェクトを使用する実装のタイプにキャストすることで、中間クラスの実装をバイパスして、メソッドの基本実装を直接呼び出すことができます。それで;

class A
{
    public virtual void virtualParentMethod()
    {
        Console.WriteLine("A");
    }
}
class B : A
{
    public new void virtualParentMethod()
    {
        Console.WriteLine("B");
    }
}
class C : B
{
    public new void virtualParentMethod()
    {
        // casting this to A will allow you to call the base class implementation
        ((A)this).virtualParentMethod();
    }
}

この変更を行うと、オブジェクトの参照方法に応じて、メソッドの呼び出し元に動作の変更が導入されることに注意してください。また、既存のC.virtualParentMethod実装(「オーバーライド」と宣言)でこの方法でキャストしようとすると、実際にはメソッド自体を呼び出しているだけで、無限ループに陥ります。

または、クラスの設計を再考することもできます。:-)

于 2012-04-18T23:51:07.530 に答える
0

それはVirtual Method Tableの本質であるため、virtualキーワードとそのオーバーライドはできません。呼び出しメソッドのアドレスは、対応する実数型の仮想メソッド テーブルから検索されます。

于 2012-04-16T12:15:03.377 に答える
0

できません。base.MethodName を使用すると、常に階層の最も近い実装が呼び出され、呼び出すことができるメソッドを明示的に宣言せずにこれを渡す方法はありません

また、このオッズを実行したい状況に陥った場合は、設計上の欠陥があることにも注意してください。

于 2012-04-16T12:17:48.373 に答える