次の方法で共有


シャドウとオーバーライドの違い (Visual Basic)

基底クラスから継承するクラスを定義するときに、派生クラス内の 1 つ以上の基底クラス要素を再定義することが必要な場合があります。 この目的では、シャドウとオーバーライドの両方を使用できます。

比較

シャドウとオーバーライドの両方は、派生クラスが基底クラスから継承されるときに使用され、宣言された 1 つの要素を別の要素で再定義します。 しかし、この 2 つの間には大きな違いがあります。

次の表は、シャドウ処理とオーバーライドを比較しています。

比較のポイント シャドウ オーバーライド
目的 派生クラスで既に定義されているメンバーを導入する後続の基底クラスの変更から保護します 同じ呼び出しシーケンス1 を持つプロシージャまたはプロパティの異なる実装を定義することによってポリモーフィズムを実現します。
再定義された要素 任意の宣言された要素型 プロシージャ (FunctionSub、または Operator) またはプロパティのみ
要素の再定義 任意の宣言された要素型 同じ呼び出しシーケンス1 を持つプロシージャまたはプロパティのみ
再定義要素のアクセス レベル 任意のアクセス レベル オーバーライドされた要素のアクセス レベルを変更できません
要素の再定義の読みやすさと書き込み可能性 任意の組み合わせ オーバーライドされたプロパティの読みやすさまたは書き込み可能性を変更できません
再定義の制御 基底クラス要素はシャドウを強制または禁止できません 基底クラス要素はMustOverrideNotOverridable、またはOverridableを指定することができる。
キーワードの使用法 Shadows派生クラスで推奨されます。ShadowsまたはShadowsが指定されていない場合Overridesを想定します2 Overridable または基底クラス MustOverride 必要です。派生クラス Overrides 必要です
派生クラスから派生するクラスによる再定義する要素の継承 追加の派生クラスによって継承されたシャドウ要素。シャドウされた要素がまだ非表示3 追加の派生クラスによって継承された要素をオーバーライドしますが、オーバーライドされた要素はそのままオーバーライドされた状態のままです。

1呼び出し元のシーケンス は、要素の型 (FunctionSubOperator、または Property)、名前、パラメーター リスト、および戻り値の型で構成されます。 プロパティでプロシージャをオーバーライドすることはできません。また、その逆もできません。 ある種類のプロシージャ (FunctionSub、または Operator) を別の種類でオーバーライドすることはできません。

2Shadows または Overridesを指定しない場合、コンパイラは警告メッセージを発行して、使用する再定義の種類を確認します。 警告を無視すると、シャドウ メカニズムが使用されます。

3 追加の派生クラスでシャドウ要素にアクセスできない場合、シャドウは継承されません。 たとえば、シャドウ要素を Privateとして宣言した場合、派生クラスから派生したクラスは、シャドウ要素ではなく元の要素を継承します。

ガイドライン

通常、オーバーライドは次の場合に使用します。

  • ポリモーフィックな派生クラスを定義しています。

  • コンパイラで同一の要素型と呼び出しシーケンスを適用することの安全性が必要です。

通常、シャドウは次の場合に使用します。

  • あなたは基底クラスが変更され、自分と同じ名前の要素が定義される可能性を予期しています。

  • 要素の型や呼び出しシーケンスを自由に変更したいと思っています。

こちらも参照ください