次の方法で共有


シャドウとオーバーライドの違い

更新 : 2007 年 11 月

基本クラスを継承するクラスを定義する際に、基本クラスの要素のいくつかを派生クラスで再定義する場合があります。シャドウとオーバーライドは、どちらもこの目的で使用できます。

比較

シャドウとオーバーライドは混同しやすい機能です。どちらも、派生クラスが基本クラスから継承するときに使用され、宣言された要素を他の要素で再定義します。しかし、シャドウとオーバーライドの間には大きな違いがあります。

シャドウとオーバーライドの比較を次の表に示します。

比較のポイント

シャドウ

オーバーライド

目的

派生クラスで既に定義されているメンバを追加するような基本クラスの変更を防ぐ

呼び出しシーケンスが同じで実装が異なるプロシージャまたはプロパティを定義することにより、ポリモーフィズムを実現する 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) を他の種類のプロシージャでオーバーライドすることはできません。

2Shadows と Overrides のどちらも指定していない場合、どちらの再定義を使用するのかを確認するよう促すための警告メッセージがコンパイラから出力されます。警告を無視すると、シャドウが使用されます。

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

ガイドライン

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

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

  • 安全のために、コンパイラで同一の要素型と呼び出しシーケンスを適用させる場合。

次のような場合は、通常、シャドウを使用します。

  • 基本クラスが変更される可能性があり、使用している名前と同じ名前で要素を定義する可能性がある場合。

  • 要素型や呼び出しシーケンスを自由に変更できるようにする場合。

参照

処理手順

方法 : 同じ名前を持つ 2 つの要素を区別する

方法 : 自分で宣言した変数と同じ名前の変数を隠す

方法 : 継承された変数を隠す

方法 : 派生クラスによって非表示になっている変数にアクセスする

概念

同じ名前を持つ複数の変数がある場合に参照を解決する

Visual Basic におけるシャドウ

参照

Shadows

Overrides

その他の技術情報

宣言された要素の参照