すぐに CS101 に戻ります。Add
クラスのメソッドの動作を拡張しようとしていConcurrentDictionary
ます。存在しないvirtual
かabstract
、キーワードでマークする必要がないため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
私が実装した動作を無視して、スーパークラス (デフォルトの動作) を呼び出すことができますか?