ステップアップ Visual Basic 「モジュールの活用」

モジュールの定義

Public Module MyUtil
    ' メンバ変数
    Public PI As Double = 3.14R

    Public Function GetBigger(
                             ByVal x As Integer, _
                             ByVal y As Integer) As Integer
        If x >= y Then Return x Else Return y
    End Function
End Module

モジュールの使用方法

Private Sub TestProc01()
        Dim util As New MyUtil() ' 不可!
        Dim a = util.PI          ' 不可!
        Dim b = util.GetBigger(10, 20) ' 不可!

        Dim c = MyUtil.PI         ' 共有変数としての使用
        Dim d = MyUtil.GetBigger(10, 20) ' 共有メソッドとしての使用

        Dim e = PI ' グローバル変数としての使用
        Dim f = GetBigger(10, 20) ' グローバル関数としての使用
    End Sub

「モジュール」の構成メンバは、下記の2点においてクラスや構造体のそれとは使用方法が異なります。

  • 常に暗黙的に共有メンバである(暗黙的にShared修飾しが付いていると見なせる)

「モジュール」では、すべての構成メンバが暗黙的に共有メンバなので、インスタンスを作る必要はなく、文法上もインスタンスを作成することが禁止されています。
このような、共有メンバを使用するケースは、特定のインスタンスに関係しないデータの場合や、特定のインスタンスに関係しない操作を行う場合に適しています。
このように、特定のインスタンスにひも付かないメンバが共有メンバであり、一般にこのようなメンバを集めたオブジェクト(クラス)を「ユーティリティクラス」と言います。

グローバル変数/関数は、特定のオブジェクトに属さない変数や関数のことです。表記上は、「オブジェクト名.〜」のように所属するオブジェクトを記述せず、単体の変数名や関数名として表記できます。
グローバル変数/関数の使い方は、VB独自の使い方なので注意

他の型との構文や機能での違い

機能 モジュール クラス 構造体
インスタンスの作成 ×
継承 × ×
インターフェイスの実装 ×
共有メンバの定義
インスタンスメンバの定義 ×

一般的な使い分けとしては、本格的なオブジェクトであればクラスを使用し、比較的軽量なオブジェクトでは構造体を使用する。そして、ユーティリティクラスであれば、モジュールを使用することになります。

クラスとの内部実装の違い

構文レベルで「モジュール」がクラスよりも向いている点の他に、内部的な実装でも「モジュール」が優れている点があります。
それは、「インスタンスコンストラクタ」を持つことができない点です。クラスで「ユーティリティクラス」として共有メンバだけを定義しても、引数なしのコンストラクタが生成されてしまいます。

C#との互換性

多言語からも「モジュール」を参照できます。C#から見た場合、「静的クラス(staticクラス)」として認識されます。