連載
» 2007年02月15日 00時00分 公開

基礎解説 演習方式で身につけるチェック式WSH超入門:第9回 VBScriptのオブジェクトを使いこなす (3/4)

[牟田口大介(Microsoft MVP Visual Developer - Scripting),著]

 さて、ここまででオブジェクトとは何かについて述べ、実際にオブジェクトを使う例(Errオブジェクト)をお見せした。次は、オリジナルのオブジェクトを作る方法について述べたい。

クラスの自作―Classステートメント

 VBScriptではClassステートメントを用いて独自のクラスを記述することができる。もちろん、記述したクラスはインスタンス化することができ、オブジェクトとして扱える。

 読み書き可能なただ1つのプロパティCaptionを持つクラス、Sampleを宣言し、それをインスタンス化するには次のように記述する。

Option Explicit

'クラス Sampleの定義。
Class Sample
    'Captionプロパティ。
    Public Caption
End Class

'オブジェクト変数の宣言。
Dim objSample1
'オブジェクトの作成。
Set objSample1 = New Sample
'オブジェクトのプロパティに値を代入。
objSample1.Caption = "秋葉原に着いたにょー"
'オブジェクトのプロパティの値を読み込む。
MsgBox objSample1.Caption
'オブジェクト変数の破棄。
Set objSample1 = Nothing

 このスクリプトを実行すると、次のようなメッセージ・ボックスが表示される。

Sampleクラスをインスタンス化
クラスをインスタンス化し、生成したオブジェクトのプロパティに値を代入・値の読み込みを行っている。

 クラスはClass <クラス名> 〜 End Classの間に記述する。ここではCaptionプロパティを持たせたいので、Publicステートメントを用い、パブリック変数を宣言する。PublicステートメントはDimステートメントのクラス版のようなもので、クラスの外部から読み書き可能な変数、すなわちプロパティを定義するものである。

 実際にこのクラスを使うには、まずこのクラスのオブジェクトを格納するためのオブジェクト変数を定義する。これは普通の変数定義と同様であるが、ここではオブジェクト(Object)変数であることを明確にするため、接頭辞「obj」を用いている。

 次にSetステートメントでNewキーワードを使用して、Sampleクラスをインスタンス化している。これでobjSample1というオブジェクト変数にSampleクラスのインスタンス(オブジェクト)が格納された。

 あとはErrオブジェクトの場合と同様であり、値を代入したり、値を読み込んだりすることが可能である。

 そして最後にSetステートメントでNothingという特殊な値を代入することで、オブジェクトを破棄している。WSHにおいては、スクリプト終了時にすべてのオブジェクト変数に格納されたオブジェクトは解放されるので、このスクリプトでは必ずしも必要ではないが、使わなくなったオブジェクトはその時点でNothingにしておくのが望ましい。

 このように、VBScriptではオブジェクト変数にオブジェクトや値を代入する際はSetキーワードを使うのが決まりであるので覚えておいてもらいたい。

 ちなみに、VBScriptにはデフォルトで存在するクラス、RegExpクラスというものがある。これは、正規表現という文字列を便利に扱うための機能を提供するものだが、デフォルトで存在するので、Classステートメントがなくても

Set objRegExp = New RegExp

としてインスタンス化することが可能である。本連載では正規表現については取り上げないが、興味がある方はヘルプなどを参照してもらいたい。

 次に、1つのクラスに対して複数のオブジェクトを作成できることを確認しよう。Classステートメントはそのままで、続きを以下のように変えてみたものを実行してもらいたい。

'オブジェクト変数の宣言。
Dim objSample1, objSample2
'オブジェクトの作成。
Set objSample1 = New Sample
Set objSample2 = New Sample
'オブジェクトのプロパティに値を代入。
objSample1.Caption = "秋葉原に着いたにょー"
objSample2.Caption = "素敵なサムシングにゅ"
'オブジェクトのプロパティの値を読み込む。
MsgBox objSample2.Caption & vbCrLf & objSample1.Caption
'オブジェクト変数の破棄。
Set objSample1 = Nothing
Set objSample2 = Nothing

 このスクリプトを実行すると次のようなメッセージ・ボックスが表示される。

1つのクラスに対し複数のオブジェクトを生成した例
クラスは1つだが、それに対して複数のオブジェクトが生成可能である。

 この例ではobjSample1とobjSample2という2つのオブジェクト変数を宣言し、それぞれにSampleクラスのインスタンスを代入している。これらはそれぞれ独立したプロパティ値を持てることが確認できる。

Property Getステートメント、Property Letステートメントを用いたプロパティの定義

 Captionプロパティに値を代入する際に何か処理を加えたい場合などは、Publicステートメントの代わりにProperty Getステートメント、Property Letステートメントを用いる。先ほどのスクリプトのClassステートメントの部分だけ次のように書き換えて実行してみてもらいたい。同じ結果が得られるはずである。

Class Sample
    'プライベート変数の設定。
    Private m_strCaption

    'Captionプロパティの値を設定。
    Public Property Let Caption(Value)
        m_strCaption = Value
    End Property

    'Captionプロパティの値を取得。
    Public Property Get Caption
        Caption = m_strCaption
    End Property
End Class

 まず、先ほどとは違い、Privateステートメントを用い、クラスの外部からは参照も書き込みもできない変数(プライベート変数)、m_strCaptionを宣言している。この変数はクラスの内部でのみ読み書きが可能である。プライベート変数は「m_」という接頭辞を付けるのが慣例である。

 Property Letステートメントは、そのクラスがインスタンス化される際、プロパティに値が代入されるときに実行される。代入された値は引数(ここではValue)に格納されるので、先ほど宣言したプライベート変数にその値を代入する。この際、パブリック変数でプロパティを定義したときとは違い、Valueに対してさまざまな処理が可能である。例えばTrim関数を使って前後のスペースを取ったり、長すぎる文字列が格納されそうになったときにエラーを発生させたりすることができる。

 Property Getステートメントは、そのクラスがインスタンス化された際、プロパティの値が参照されるときに実行される。ここでは、プロパティ名であるCaptionにプライベート変数m_strCaptionを代入することでオブジェクトに対しプロパティの値を返すことが可能になる。

 ここで、Public Default Property Get CaptionのようにするとCaptionプロパティは既定のプロパティになり、読み込む際に「.Caption」を省略することができる。

 なお、Property LetステートメントおよびProperty Getステートメントにおいて、Publicキーワードは省略可能である。逆にプライベートな(クラス内でのみ参照可能な)プロパティを宣言するにはPrivateキーワードを併用する。

 読み込み専用(値の設定はできない)プロパティにするには、単にProperty Getステートメントのみ記述し、 Property Letステートメントを記述しなければよい。だがそのままだと値が設定できないプロパティは参照しても単にEmpty値を返すだけなので、ここではインスタンス化されるタイミングで既定の値を格納しておくことにする。それにはInitializeイベント(コンストラクタともいう)を定義する。

Option Explicit

Class Sample
    'プライベート変数の設定。
    Private m_strCaption

    Private Sub Class_Initialize()
        m_strCaption = "うさだって言うな!"
    End Sub

    'Captionプロパティの値を取得。
    Public Property Get Caption
        Caption = m_strCaption
    End Property
End Class

'オブジェクト変数の宣言。
Dim objSample1
'オブジェクトの作成。
Set objSample1 = New Sample
'オブジェクトのプロパティの値を読み込む。
MsgBox objSample1.Caption
'オブジェクト変数の破棄。
Set objSample1 = Nothing

 Private Sub Class_Initialize()とEnd Subの間にコンストラクタを記述する。ここではm_strCaption変数に文字列を代入している。この部分はクラスがインスタンス化されるタイミングで実行されるので、その後、プロパティを参照するとコンストラクタで格納した文字列が取得できるというわけである。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。