シャドウとオーバーライドの違い (Visual Basic)
基本クラスを継承するクラスを定義する際に、基本クラスの要素のいくつかを派生クラスで再定義する場合があります。 シャドウとオーバーライドは、どちらもこの目的で使用できます。
比較
シャドウとオーバーライドはどちらも、派生クラスが基本クラスから継承するときに使用され、宣言された要素を他の要素で再定義します。 しかし、シャドウとオーバーライドの間には大きな違いがあります。
シャドウとオーバーライドの比較を次の表に示します。
比較のポイント |
シャドウ |
オーバーライド |
目的 |
派生クラスで既に定義されているメンバーを追加するような基本クラスの変更を防ぐ |
呼び出しシーケンスが同じで実装が異なるプロシージャまたはプロパティを定義することにより、ポリモーフィズムを実現する 1 |
再定義される要素 |
任意の宣言された要素型 |
プロシージャ (Function、Sub、Operator) またはプロパティのみ |
再定義する要素 |
任意の宣言された要素型 |
呼び出しシーケンスが同じプロシージャまたはプロパティのみ 1 |
再定義する要素のアクセス レベル |
任意のアクセス レベル |
オーバーライドされた要素のアクセス レベルは変更できない |
再定義する要素の読み取りと書き込みの許可 |
任意の組み合わせ |
オーバーライドされたプロパティの読み取りと書き込みの許可は変更できない |
再定義の制御 |
基本クラスの要素にシャドウを強制または禁止することはできない |
基本クラスの要素に MustOverride、NotOverridable または Overridable を指定できる |
キーワードの使用法 |
派生クラスでは Shadows を推奨。Shadows と Overrides のどちらも指定されない場合は、Shadows と見なされる 2 |
基本クラスでは Overridable または MustOverride が必要。派生クラスでは Overrides が必要 |
派生クラスから派生するクラスでの、再定義する要素の継承 |
シャドウする要素は以降の派生クラスでも継承され、シャドウされる要素は引き続き隠される 3 |
オーバーライドする要素は以降の派生クラスでも継承され、オーバーライドされる要素は引き続きオーバーライドされる |
1 呼び出しシーケンスは、要素型 (Function、Sub、Operator、または Property)、名前、パラメーター リスト、および戻り値の型で構成されます。 プロシージャをプロパティでオーバーライドしたり、プロパティをプロシージャでオーバーライドしたりはできません。 ある種類のプロシージャ (Function、Sub、または Operator) を他の種類のプロシージャでオーバーライドすることはできません。
2 Shadows と Overrides のどちらも指定していない場合、どちらの再定義を使用するのかを確認するよう促すための警告メッセージがコンパイラから出力されます。 警告を無視すると、シャドウが使用されます。
3 派生クラスからさらに派生するクラスで、シャドウする側の要素にアクセスできない場合、シャドウは継承されません。 たとえば、シャドウする側の要素を Private として宣言した場合、派生クラスから派生するクラスは、その要素の代わりに元の要素を継承します。
ガイドライン
次のような場合は、通常、オーバーライドを使用します。
ポリモーフィックな派生クラスを定義している場合。
安全のために、コンパイラで同一の要素型と呼び出しシーケンスを適用させる場合。
次のような場合は、通常、シャドウを使用します。
基本クラスが変更される可能性があり、使用している名前と同じ名前で要素を定義する可能性がある場合。
要素型や呼び出しシーケンスを自由に変更できるようにする場合。
参照
処理手順
方法: 自分で宣言した変数と同じ名前の変数を隠す (Visual Basic)
方法: 派生クラスによって非表示になっている変数にアクセスする (Visual Basic)