【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
   
基礎解説
チェック式 WSH入門 第9回

3.クラスを自作する

Microsoft MVP
Visual Developer - Scripting
牟田口 大介
2007/02/15
Page1 Page2 Page3 Page4

 さて、ここまででオブジェクトとは何かについて述べ、実際にオブジェクトを使う例(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変数に文字列を代入している。この部分はクラスがインスタンス化されるタイミングで実行されるので、その後、プロパティを参照するとコンストラクタで格納した文字列が取得できるというわけである。


 INDEX
  [基礎解説]チェック式 WSH入門
  第9回 VBScriptのオブジェクトを使いこなす
    1.オブジェクトとは
    2.VBScriptにおけるエラー処理
  3.クラスを自作する
    4.メソッドを定義する
 
 基礎解説

ホワイトペーパーTechTargetジャパン

Windows Server Insider フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています