Visual Basic でのモジュールのオブジェクト指向の変更

更新 : 2007 年 11 月

共有メンバは、クラスのすべてのメンバで使用できるが、クラスの特定のインスタンスには関連付けられていないクラス メンバ (プロパティやプロシージャなど) です。共有メンバの詳細については、「Visual Basic の共有メンバ」を参照してください。

インスタンス データと共有データ

インスタンス データは、New キーワードの実行時に作成される一連のデータです。それに対して、クラスの共有データは New キーワードの実行とは無関係に作成されます。

Visual Basic 6.0

Visual Basic 6.0 では、クラス定義で共有データはサポートされません。データをクラス インスタンス間で共有するには、モジュールでグローバル変数を使用します。

Visual Basic 2008

共有データを宣言するには、次のように Shared (Visual Basic) 修飾子を変数宣言のステートメントに追加します。

Private Shared totalInstances As Integer

共有メソッド

Visual Basic 6.0

Visual Basic 6.0 では、共有クラス メンバはサポートされていません。同じような機能は、モジュールで使用できます。ランタイムは、モジュール内にデータのインスタンスを 1 つだけ作成します。モジュールのデータとメソッドのスコープは、プロジェクト全体です。ライブラリをモジュールに実装した例を以下に示します。

Public Sub GetTitle(wordXml As String)
    ' Add code here to find title in Xml string.
End Sub

Public Sub ReplaceTitle(wordXml As String, newTitle As String)
    ' Add code here to replace title.
End Sub

Visual Basic 2008

メンバがライブラリとして互いに関連する場合や、メンバが既存のクラスに関連する場合、よりオブジェクト指向性の強い方法でモジュールは共有クラス メンバを使用します。この設計では、すべてのメンバが共有されるのか、共有メンバとインスタンス メンバがクラスに混在するのかが確認されます。クラスに共有メンバだけが含まれる場合は、プライベートなコンストラクタだけを追加して、クラスがクライアント コードでインスタンス化されないようにします。次のコード例は、クライアント コードでインスタンス化できないクラスと、メンバの 1 つを呼び出すクライアント コードを示します。

Public Class WordLibrary
    Public Shared Sub GetTitle(ByVal wordXml As String)
        ' Add code here to find title in Xml string.
    End Sub

    Public Shared Sub ReplaceTitle(ByVal wordXml As String, _
        ByVal newTitle As String)
        ' Add code here to replace title.
    End Sub

    Private Sub New()
        ' This prevents instantiation of the class in the client.
    End Sub
End Class
' Code that calls the library method.
Sub ChangeTheTitle()
    WordLibrary.ReplaceTitle("Old Title", "New Title")
End Sub

このライブラリにモジュールではなくクラスを使う利点は、以下のとおりです。

  • ライブラリに名前 (WordLibrary) があり、コード内に明示されます。

  • メソッドが 1 つのクラスにまとめられ、互いに関連性があることが示されます。

  • プライベートなコンストラクタを使うことで、このクラスが一連のユーティリティ メソッドを提供することが明確になります。

  • クライアント コードでライブラリ名を使用すると、コードを読むときにプロジェクトの編成がわかります。

.NET Framework では、共有メソッドは、主にクラスには関連する機能を提供するために使用されますが、クラスのインスタンスは必要としません。たとえば、Parse メソッドは、.NET Framework の多くのデータ型でサポートされています。整数型 (Integer) (Visual Basic) は、文字列をパラメータとして受け取る Parse メソッドをサポートしています。この Parse メソッドは、文字列で表現された整数を返します。Parse メソッドをメンバ メソッドにするのは不合理です。整数ではなく、文字列しか扱わないからです。

共有メンバへのアクセス

Visual Basic 6.0

Visual Basic 6.0 では、共有クラス メンバはサポートされていません。

Visual Basic 2008

共有メンバには、次のようにクラス名とインスタンス名を使ってアクセスできます。

WordLibrary.ReplaceTitle("Old Title", "New Title")

クラスのインスタンスへの参照を受け取った場合を除き、共有メソッドからはインスタンス データにアクセスできません。

アップグレードのヒント

Visual Basic 6.0 の WordLibrary モジュールは、次のコードにアップグレードされます。

Module WordLibrary
    Public Sub GetTitle(ByRef wordXml As String)
        ' Add code here to find title in Xml string.
    End Sub

    Public Sub ReplaceTitle(ByRef wordXml As String, _
        ByRef newTitle As String)
        ' Add code here to replace title.
    End Sub
End Module

モジュールのコードを Visual Basic 6.0 から Visual Basic 2008 にアップグレードする場合は、次の点に注意してください。

  • モジュールのメソッドとデータは、共有データと共有メソッドとしてクラスに編成します。

  • 既存のクラスに関連するモジュール メソッドは、共有メソッドとしてそのクラスに移動します。

参照

概念

Visual Basic の共有メンバ