1

すぐに CS101 に戻ります。Addクラスのメソッドの動作を拡張しようとしていConcurrentDictionaryます。存在しないvirtualabstract、キーワードでマークする必要がないためoverride、サブクラスに同じシグネチャを持つ新しい関数を簡単に作成できます。

これを行うと、次のようなビジュアルスタジオメッセージに気付きますが

非表示が意図されている場合は、new キーワードを使用します。

このキーワードを使用すると、サブクラスのインスタンスから呼び出されたときのメソッドの実行方法が変わりますか?

たとえば、以下のコードでは、クラスのインスタンスがあり、MyClassEx呼び出したMethod1場合Method1、スーパークラスでは正しく呼び出されません (自分で呼び出した場合のみbase)?. この同じインスタンスを呼び出すとMethod2、同じ結果が発生し、サブクラスのみMethod2が実行されますか?

public class MyClass
{
    public void Method1() { Console.Out.WriteLine("MyClass.Method1"); }
    public void Method2() { Console.Out.WriteLine("MyClass.Method2"); }
}

public class MyClassEx : MyClass
{
    public void Method1()
    {
        Console.Out.WriteLine("MyClassEx.Method1");
        //base.Method1();
    }

    public new void Method2()
    {
        Console.Out.WriteLine("MyClassEx.Method2");
        //base.Method2();
    }
}

この方法でキーワードを使用しているのは、new単に「適切なコーディング」ですか、それとも何らかの効果がありますか?

編集:このように見えるのは、単なる「適切なコーディング」です。それはわずかな懸念を引き起こしますが。Addサブクラスに新しいメソッドを作成して、メソッドの動作を変更したいと考えていますConcurrentDictionary。リンクされた回答からは、スーパークラスのサブクラスを参照するだけで、別のコーダーが私の新しい実装を回避できるようです。

MyClassEx mycex = new MyClassEx();
((MyClass)mycex).Method2();

この場合、Method2私が実装した動作を無視して、スーパークラス (デフォルトの動作) を呼び出すことができますか?

4

2 に答える 2