Class_Initialize の変更点 (Visual Basic 6.0 ユーザー向け)
更新 : 2007 年 11 月
コンストラクタは、オブジェクトを作成するときに実行するメソッドです。コンストラクタは、これまで Visual Basic に導入されていませんでした。コンストラクタは、New ステートメントと Visual Basic 6.0 の Class_Initialize メソッドの動作を併せ持ちますが、クラス インスタンスを作成するための柔軟性と制御の機能をさらに高いレベルで備えています。オブジェクトの作成の詳細については、「オブジェクトの作成と使用」を参照してください。
Class_Initialize
Visual Basic 6.0
Visual Basic 6.0 では、コンストラクタの概念は Class_Initialize メソッドをとおしてサポートされます。このメソッドはプライベートであり、パラメータは指定できません。このメソッドは、クラスの新しいインスタンスを作成するときに自動的に呼び出されます。New キーワードを呼び出すと、Class_Initialize メソッドが呼び出されます (このメソッドが存在しない場合は呼び出されません)。
たとえば、既定を 5 年間として、樹木の年間成長率を指定するとします。クラス コードは次のようになります。
' Visual Basic 6.0
Private mvarYearlyGrowth As Integer
Public Property Get YearlyGrowth() As Integer
YearlyGrowth = mvarYearlyGrowth
End Property
Public Property Let YearlyGrowth(ByVal newValue As Integer)
mvarYearlyGrowth = newValue
End Property
Private Sub Class_Initialize()
mvarHeight = 5
End Sub
樹木を作成し、プロパティを設定するコードは、次のようになります。
Dim growingTree As New Tree
growingTree.YearlyGrowth = 10
Visual Basic 2008
Visual Basic 2008 では、コンストラクタは New キーワードを通してサポートされます。この場合、YearlyGrowth プロパティを設定するコードは不要です。New キーワードを呼び出すと、クラスのオーバーロードされた New メソッドの 1 つが呼び出されます。クラスに New メソッドが存在しない場合は、このメソッドがパラメータなしでコンパイラによって作成されます。
Option Strict On
Public Class Tree
Private yearlyGrowthValue As Integer = 5
Public Property YearlyGrowth() As Integer
Get
Return yearlyGrowthValue
End Get
Set(ByVal Value As Integer)
yearlyGrowthValue = Value
End Set
End Property
Public Sub New(ByVal newYearlyGrowth As Integer)
Me.YearlyGrowth = newYearlyGrowth
End Sub
End Class
樹木を作成し、プロパティを設定するコードは、次のようになります。
Dim growingTree As New Tree(10)
この例では、年間成長率を指定しないで Tree を作成することはできません。これをできるようにするには、パラメータのない別の New メソッドをクラスに追加します。これは、コンストラクタを "オーバーロードする" と呼ばれます。
New キーワード
Visual Basic 6.0
Visual Basic 6.0 では、次のようなコード行は一般に推奨されません。
Dim growingTree As New Tree
その理由は、growingTree 変数にアクセスするたびに、コンパイラでは値が Nothing かどうかがチェックされるからです。この値であれば、新しいインスタンスが作成され、growingTree に割り当てられます。これは効率が悪いだけでなく、プログラミング エラーにもつながります。
Visual Basic 2008
Visual Basic 2008 では、インスタンスはチェックされず、新しいインスタンスは作成されません。新しいインスタンスを作成する唯一の方法は、New または As New キーワードを使ってコード行を実行することです。事実上、このようなコード行は、新しいインスタンスの作成を扱う際に現在推奨される唯一の方法です。
アップグレードのヒント
アップグレード ウィザードは、Class_Initialize メソッドを次のコードにアップグレードします。
'UPGRADE_NOTE: Class_Initialize was upgraded to Class_Initialize_Renamed. Click for more: ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1061"'
Private mvarHeight As Short
Private Sub Class_Initialize_Renamed()
mvarHeight = 0
End Sub
Public Sub New()
MyBase.New()
Class_Initialize_Renamed()
End Sub
Class_Initialize_Renamed の呼び出しを削除し、このコードをコンストラクタに直接移動してもかまいません。不要なプロシージャ呼び出しが省かれるので、コードが読みやすくなります。ほとんどの New 呼び出しの後で特定のプロパティを設定している場合は、それらのプロパティを設定するコンストラクタを追加することをお勧めします。Visual Basic 6.0 コードは、Visual Basic 2008 では次のコードで置き換えることができます。
Public Sub New(ByVal newYearlyGrowth As Integer)
Me.YearlyGrowth = newYearlyGrowth
End Sub