[C#] methodのnew キーワード

base classがvirtual宣言していないmethodをderived class(子クラス)が定義すると、コンパイラが次のようなエラーで警告する。

‘newmethod.DerivedClass.NonVirtualMethod()’ は継承されたメンバ ‘newmethod.BaseClass.NonVirtualMethod()’ を非表示にします。非表示にする場合は、new キーワードを使用してください。

「非表示」と和訳されている言葉は英語では ‘hide’。
同種のエラーメッセージは英語では以下のようになるらしい。

‘member1’ hides inherited member ‘member2’. Use the new keyword if hiding was intended.

virtual と newの違いは以下のようにするとわかる。

class BaseClass
{
     ...
     public void NonVirtualMethod()
     {
          Console.WriteLine("NonVirtualMethod in BaseClass");
     }
}
class DerivedClass : BaseClass
{
     ....
     public new void NonVirtualMethod()
     {
           Console.WriteLine("NonVirtualMethod in DerivedClass");
     }
}

このDerivedClassのobjectをBaseClassのobjectにupcastした後で、NonVirtualMethodを呼び出す。

DerivedClass dc = new DerivedClass(); // DerivedClassのobjectを
BaseClass bc = dc;  // BaseClassのobjectに代入する
bc.NonVirtualMethod();

このとき呼び出されるのはBaseClassのmethodになる。
virtualなmethodの場合には上記で子クラスのmethod(DerivedClassでoverride宣言しているもの)が呼ばれる。

広告
%d人のブロガーが「いいね」をつけました。