C#4.0の仕様は次のとおりです。
仮想メソッドが呼び出されると、その呼び出しが行われるインスタンスのランタイムタイプによって、呼び出す実際のメソッド実装が決まります。非仮想メソッドの呼び出しでは、インスタンスのコンパイル時のタイプが決定要因になります。
最初は、これは初期化と関係があると思いました。たとえば、2つの初期化が与えられます。
BaseClass bcDerived = new Derived();
vsBaseClass bcBase = new BaseClass();
ヘルパークラスのオーバーロード:
public virtual void Method(Derived d)
{
Console.WriteLine("Result = derived called");
}
public virtual void Method(BaseClass d)
{
Console.WriteLine("Result = base called");
}
Method
この場合、呼び出しはvirtual
キーワードの影響を受けません。をマークしたかどうかに関係なくvirtual
、最小の派生オーバーロードが呼び出されます。Derivedクラスでのみoverride
、メソッド呼び出しが変更されます。
では、「ランタイムタイプ」と「コンパイル時タイプ」はどういう意味ですか?それらはメソッド呼び出しにどのように影響しますか?