基底クラスから継承するクラスを定義するときに、派生クラス内の 1 つ以上の基底クラス要素を再定義することが必要な場合があります。 この目的では、シャドウとオーバーライドの両方を使用できます。
比較
シャドウとオーバーライドの両方は、派生クラスが基底クラスから継承されるときに使用され、宣言された 1 つの要素を別の要素で再定義します。 しかし、この 2 つの間には大きな違いがあります。
次の表は、シャドウ処理とオーバーライドを比較しています。
| 比較のポイント | シャドーイング | オーバーライド |
|---|---|---|
| 目的 | 派生クラスで既に定義されているメンバーを導入する後続の基底クラスの変更から保護します | 同じ呼び出しシーケンス1 を持つプロシージャまたはプロパティの異なる実装を定義することによってポリモーフィズムを実現します。 |
| 再定義された要素 | 宣言された要素型 | プロシージャ (Function、 Sub、または Operator) またはプロパティのみ |
| 要素の再定義 | 宣言された要素型 | 同じ呼び出しシーケンス1 を持つプロシージャまたはプロパティのみ |
| 再定義要素のアクセス レベル | 任意のアクセス レベル | オーバーライドされた要素のアクセス レベルを変更できません |
| 要素の再定義の読みやすさと書き込み可能性 | 任意の組み合わせ | オーバーライドされたプロパティの読みやすさまたは書き込み可能性を変更できません |
| 再定義の制御 | 基底クラス要素はシャドウを強制または禁止できません | 基底クラス要素は、 MustOverride、 NotOverridable、または Overridable |
| キーワードの使用法 |
Shadows派生クラスで推奨されます。Shadows、Shadowsも指定Overrides2 でもない場合に想定されます |
Overridable または基底クラス MustOverride 必要です。派生クラス Overrides 必要です |
| 派生クラスから派生するクラスによる再定義要素の継承 | 追加の派生クラスによって継承されたシャドウ要素。シャドウされた要素がまだ非表示3 | 追加の派生クラスによって継承された要素をオーバーライドする。オーバーライドされた要素は引き続きオーバーライドされます |
1呼び出し元のシーケンス は、要素の型 (Function、 Sub、 Operator、または Property)、名前、パラメーター リスト、および戻り値の型で構成されます。 プロシージャをプロパティでオーバーライドしたり、逆にオーバーライドしたりすることはできません。 ある種類のプロシージャ (Function、 Sub、または Operator) を別の種類でオーバーライドすることはできません。
2Shadows または Overridesを指定しない場合、コンパイラは警告メッセージを発行して、使用する再定義の種類を確認します。 警告を無視すると、シャドウ メカニズムが使用されます。
3 追加の派生クラスでシャドウ要素にアクセスできない場合、シャドウは継承されません。 たとえば、シャドウ要素を Privateとして宣言した場合、派生クラスから派生したクラスは、シャドウ要素ではなく元の要素を継承します。
ガイドライン
通常、オーバーライドは次の場合に使用します。
ポリモーフィックな派生クラスを定義しています。
コンパイラで同一の要素型と呼び出しシーケンスを適用することの安全性が必要です。
通常、シャドウは次の場合に使用します。
基底クラスが変更され、自分と同じ名前を使用して要素が定義される可能性があります。
要素の型または呼び出しシーケンスを自由に変更できます。
こちらも参照ください
.NET