派生クラス メソッドを同じ名前の基本クラス メソッドのオーバーライドとみなすべきかどうかは、多くの場合、派生クラス メソッドの作成者が基本クラス メソッドとそれに関連付けられたコントラクトを認識しており、派生メソッドを作成したかどうかに依存します。その契約を履行するためのクラスメソッド。派生クラスのメソッドが基本クラスのメソッドと同じ名前と署名を持つほとんどの場合、派生クラスのメソッドは基本クラスの契約を満たすことを意図していますが、展開された基本クラスの作成者が名前を追加した場合同じ名前が派生クラスで他の目的に使用されていることに気付かなければ、派生クラス メソッドの作成者は、その時点では存在しなかった基本クラス メソッドの契約に準拠するようにメソッドを記述したとは推定できません。 .
異なるメソッドがいつクラスに追加されたかを C# が判断できる一般的な手段がないため、派生クラス メソッドの作成者が、同じ名前の基底クラス メソッドの存在について何かを知っていたかどうかをコンパイラが知る方法はありません。ただしnew
、派生クラス メソッドの作成者が、またはoverride
修飾子を使用して、基本クラス メソッドの存在を認識しているかどうかをコンパイラに明示的に示している場合を除きます。
修飾子 (またはその欠如) を次のように解釈することをお勧めします。
なし -- 作成者は基本クラス メソッドの存在を認識していないため、その契約を履行することを期待できません。
new
-- 作成者は基本クラス メソッドを認識しており、何らかの理由でこのメソッドを実行しないように記述しています。
override
-- 作成者は基本クラス メソッドとそのコントラクトを認識しており、それを満たすためにこのメソッドを作成しました。
コンパイラがデフォルトnew
で警告付きで想定する理由は、基本クラスのメソッドが存在する前にメソッドが派生クラスに追加された場合、作成者が基本クラスの契約を認識しているとは期待できないためです。まだ存在していなかったコントラクトを履行するつもりであったとは考えられませんが、基本クラスのメソッドの後に派生クラスのメソッドが記述されている場合、作成者は通常、ベースを履行するつもりがない限り、別の名前を選択する必要があります。 -クラス契約、または契約を履行せずに同じ名前を使用する特定の理由があります。コンパイラは、どのメソッドが最初に記述されたかを判断できないため、どの動作が適切であるかを知る方法がありません。