書き換え方法はクラスで宣言されたとは考えられません

1129 ワード


クラスでメソッドを指定すると、呼び出しと互換性のある複数のメソッド(たとえば、同じ名前のメソッドが2つ存在し、パラメータが渡されたパラメータと互換性がある)がある場合、C#コンパイラは最適なメソッドを選択して呼び出します.次のメソッドは互換性があります.
C#
public class Derived : Base
{
public override void DoWork(int param) { }
public void DoWork(double param) { }
}

DerivedのインスタンスでDoWorkを呼び出すと、C#コンパイラは、最初にDerivedで宣言したDoWorkバージョンと互換性を持たせてみます.書き換えメソッドは、クラスで宣言されたものとはみなされず、ベースクラスで宣言されたメソッドの新しい実装とみなされます.C#コンパイラがDerivedの元のメソッドとメソッド呼び出しを一致させることができない場合にのみ、同じ名前と互換性のあるパラメータを持つ書き換えメソッドと呼び出しを一致させます.例:
C#
int val = 5;
Derived d = new Derived();
d.DoWork(val);  // Calls DoWork(double).

変数valはdoubleタイプに暗黙的に変換できるため、C#コンパイラはDoWork(int)ではなくDoWork(double)を呼び出します.この状況を回避するには2つの方法があります.まず,新しいメソッドを虚メソッドと同名に宣言することを避ける.次に、DerivedのインスタンスをBaseに強制的に変換することで、C#コンパイラがベースクラスメソッドのリストを検索し、ダミーメソッドを呼び出すことができます.ダミーメソッドであるため,Derived上のDoWork(int)の実装が呼び出される.例:
C#
((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.