継承の基本
更新 : 2007 年 11 月
Inherits ステートメントは、既存のクラス (基本クラス) に基づいて新しいクラス (派生クラス) を宣言するときに使用します。派生クラスは、基本クラスで定義されているプロパティ、メソッド、イベント、フィールド、および定数を継承します。また、派生クラスでこれらのプロパティ、メソッド、イベント、フィールド、および定数を拡張することもできます。ここでは、継承の規則の一部と、クラスの継承方法を変更するための修飾子について説明します。
既定では、NotInheritable キーワードが指定されていない限り、すべてのクラスを継承できます。継承するクラスは、プロジェクト内の他のクラスでも、プロジェクトが参照している他のアセンブリのクラスでもかまいません。
多重継承をサポートしている言語もありますが、Visual Basic がサポートしているのは単一継承だけです。したがって、派生クラスの基本クラスは常に 1 つだけです。クラスでは多重継承することはできませんが、複数のインターフェイスを実装することはできます。複数のインターフェイスを実装すると、多重継承と同様の結果が得られます。
基本クラスで制限されている項目が公開されるのを防ぐため、派生クラスのアクセス レベルは、基本クラスと同等またはそれより制限の厳しいレベルにする必要があります。たとえば、Public クラスは Friend クラスまたは Private クラスを継承できません。また、Friend クラスは Private クラスを継承できません。
継承の修飾子
Visual Basic では、継承をサポートするために、次に示すクラス レベルのステートメントと修飾子が導入されています。
Inherits ステートメント — 基本クラスを指定します。
NotInheritable 修飾子 — クラスを基本クラスとして使用できないように指定します。
MustInherit 修飾子 — クラスを基本クラスとしてだけ使用するように指定します。MustInherit クラスのインスタンスは直接作成できません。派生クラスの基本クラス インスタンスとして作成する必要があります。このようなクラスは、C++ や C# などの他のプログラミング言語での抽象クラスに相当します。
派生クラスにおけるプロパティとメソッドのオーバーライド
既定では、派生クラスは基本クラスのプロパティとメソッドを継承します。継承されたプロパティまたはメソッドが派生クラスの中で異なる動作をしなければならない場合、このプロパティまたはメソッドをオーバーライドできます。つまり、派生クラスに、メソッドの新しい実装を定義できます。プロパティやメソッドのオーバーライド方法を制御するには、次の修飾子を使用します。
Overridable — 派生クラスにおけるプロパティやメソッドのオーバーライドを許可します。
Overrides — 基本クラスで定義されている Overridable のプロパティやメソッドをオーバーライドします。
NotOverridable — 継承するクラスでプロパティやメソッドのオーバーライドを禁止します。既定では、Public メソッドは NotOverridable です。
MustOverride — 派生クラスにおけるプロパティやメソッドのオーバーライドを必須にします。MustOverride キーワードを使用する場合、メソッドの定義で使用できるステートメントは、Sub、Function、および Property の各ステートメントだけです。その他のステートメントは使用できません。End Sub ステートメントと End Function ステートメントも使用しません。MustInherit クラスで MustOverride メソッドを宣言する必要があります。
メソッドのオーバーライドの詳細については、「プロパティとメソッドのオーバーライド」を参照してください。
MyBase キーワード
派生クラスでメソッドをオーバーライドしている場合に基本クラスのメソッドを呼び出すには、MyBase キーワードを使用します。たとえば、基本クラスから継承したメソッドをオーバーライドする派生クラスをデザインするとします。この場合は、次の例で示すように、オーバーライドしたメソッドで基本クラスのメソッドを呼び出し、戻り値を変更できます。
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping( _
ByVal Dist As Double, _
ByVal Rate As Double) _
As Double
' Call the method in the base class and modify the return value.
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class
MyBase を使用するときには、次の制約があります。
MyBase が参照するのは、直接の基本クラスとそこで継承されているメンバです。クラスの Private メンバへのアクセスには使用できません。
MyBase はキーワードであり、実際のオブジェクトではありません。MyBase は変数に代入したり、プロシージャに渡したりできません。また、Is 比較で使用できません。
MyBase で修飾するメソッドは、必ずしも直接の基本クラスで定義される必要はありません。間接的に継承されている基本クラスで定義することもできます。MyBase で修飾した参照が正しくコンパイルされるためには、呼び出しで使用されているパラメータの名前と型に対応するメソッドが、いずれかの基本クラスに含まれている必要があります。
MyBase を使って基本クラスの MustOverride メソッドを呼び出すことはできません。
MyBase を MyBase で修飾することはできません。したがって、次のコードは無効です。
MyBase.MyBase.BtnOK_Click()
MyBase をモジュールで使用することはできません。
基本クラスが異なるアセンブリ内にある場合は、Friend と指定されている基本クラスのメンバに MyBase を使ってアクセスすることはできません。
MyClass キーワード
クラスに実装されている Overridable メソッドを呼び出すときに、派生クラスでオーバーライドされたメソッドではなく、このクラスのメソッドの実装が呼び出されるようにするには、MyClass キーワードを使用します。
MyClass はキーワードであり、実際のオブジェクトではありません。MyClass は変数に代入したり、プロシージャに渡したりできません。また、Is 比較で使用できません。
MyClass が参照するのは、外側のクラスとそこで継承されているメンバです。
MyClass は、Shared メンバの修飾子として使用できます。
MyClass を標準モジュールで使用することはできません。
基本クラスで定義されていて、クラスで実装が提供されていないメソッドを、MyClass で修飾することもできます。このような参照は、MyBase.Method と同じ意味になります。