1

私が書いているプログラムに問題があり、仮想関数が本来の動作をしていないようです。

仮想関数を持つクラスと、それをオーバーライドする派生クラスがあります。関数を呼び出すと、オーバーライドは呼び出されませんが、ベースは呼び出されます。これは私が以前に何百万回も行ったことであり、単純なケースなどでその動作がどのように壊れるかわかりません。

例として:

public class ClassA
{
  public DoStuff()
  {
    MyVirtual()
  }

  protected virtual MyVirtual()
  {
    Console.WriteLine("Base MyVirtual Called");
  }
}

public class ClassB : ClassA
{
  protected override MyVirtual()
  {
    Console.WriteLine("Overridden MyVirtual Called");
  }
}

ClassA test = new ClassB;
test.DoStuff();

この例は、効果のためだけのものです (チェックするためにコンパイルしていません。デモンストレーションを行っているだけです)。オーバーライドが呼び出されないように、何がそれを壊すのか知りたいだけです。特定のコードを貼り付けることはできませんが、理論的にはそれと同じくらい簡単です。

  • 継承階層は 2 つのクラスだけです
  • 封印された修飾子はありません
  • クラスは、継承されたクラスの new への単純な呼び出しによって作成されます
  • 仮想関数は保護され、そのように基本クラスのパブリック関数から呼び出されます

それがどのように壊れる可能性がありますか、または何がその動作を妨げる可能性がありますか? プロジェクトは非常に複雑ですが、これは私が実装していることは新しいことではありません。私の特定のコードには、まったく同じ方法で記述され、同じ方法で継承された別の仮想関数もあり、正常に動作します。その関数をコピーして貼り付けて名前を変更することで新しい関数を作成したので、構文は同じである必要があります(機能しないときに最初から再構築しましたが、動作に違いはありません)。

とにかく、私は機知に富んでいて、これのあいまいな理由を探すのに何日も費やすことはできないので、どこから探し始めるかについてのアイデアは非常に高く評価されます.

4

2 に答える 2

7

エラーを修正すると、正常にコンパイルされ、期待どおりに動作します。

修正版:

public class ClassA
{
  public void DoStuff()
  {
    MyVirtual();
  }

  protected virtual void MyVirtual()
  {
    Console.WriteLine("Base MyVirtual Called");
  }
}

public class ClassB : ClassA
{
  protected override void MyVirtual()
  {
    Console.WriteLine("Overridden MyVirtual Called");
  }
}

ClassA test = new ClassB();
test.DoStuff();

出力:

Overridden MyVirtual Called

これは基本的に、あなたの声明に反して、あなたのコードは「理論的にはそれほど単純ではない」ことを意味します。私の推測では、実際には B クラスでオーバーライドしていません。

于 2013-04-15T12:03:14.827 に答える
0

継承チェーンに複数のクラスがある場合、それらのクラス (存在する場合) に同じ名前のすべてのメソッドに「オーバーライド」があることを確認することができます。

于 2021-05-13T15:52:21.820 に答える