VBS 基礎-7 クラス
VBScriptでクラスを作成する場合 class ~ end class を使用することになります。
以下、サンプル的にクラスを作成してみます。
クラスは set 変数名 = new クラス名 という形式で使用を開始します。 以降は set 変数名 で指定した変数名に .をつけてプロパティ(値)とメソッド(内部関数)にアクセスすることになります。 このサンプルクラスにはプロパティが3つ(pdata1、pdata2、data3)そしてアクセスできるメソッドが1つ(outMsg)あります。 VBScriptのクラスにおけるコンストラクタ(クラス作成時に自動で呼び出される関数)とデストラクタ(クラス廃棄時に自動で呼び出される関数)はそれぞれ class_initialize 、 class_terminate と名前付けします。 この二つは subプロシージャとなります。
プロパティはクラス内に設定値等を保持できる等使い道のある機能です。ようは変数なんですが、メソッドも同じですが public か private かの指定を行えます。 これはアクセスの権限を示すものです。public であればクラス外からもアクセスが可能(オブジェクト名.プロパティ or メソッド)ですが、privateの場合はクラス外からのアクセスはできません。 privateにはクラス内からのみアクセスする事になります。上記でいえば プロパティの pdata2 は private 指定を受けているので、コンストラクタ内では pdata2 = 20 とできますが、 外部から sc.pdata2 = 20 とするとエラーが発生します。外部からいじられたくない変数等はこのようにして隠蔽する事でクラスの扱いは格段に安心確実になります。
クラス内にはそれ以外に property という宣言も見られます。これはそのままプロパティの宣言になります。 これを使用することで、値に格納する際にその処理を規定することができます。 上記の例では
このようにして propertyを使用たりしてサニタイズを行う事によってクラスの堅牢性は飛躍的に増すことでしょう。
上記のコードを実行した場合、ダイアログは3つ出力されるかと思います。 クラス内のプロパティを表示するようになっています。 data3 は public 指定なので sc.data3 = 30 で値が変更できています。 pdata1 は private 指定ですが、property let によって バイパスされていますので、 data1 = 100 とすることで pdata1 に値が設定されています。 唯一 pdata2 だけが外部からアクセス手段を持ちませんので、コンストラクタ内で指定された20という値を外部から変更する事はできません。 クラス内のメソッド(関数)としては outMsg が用意されています。 オブジェクト名.メソッド とすることで関数にアクセスできます(publicの場合)。
dim sc
set sc = new sampleclass
sc.data1 = 100
sc.data3 = 30
sc.outMsg(1)
sc.outMsg(2)
sc.outMsg(3)
class sampleclass
private pdata1
private pdata2
public data3
public sub class_initialize()
pdata1 = 10
pdata2 = 20
end sub
public sub class_terminate()
end sub
public property Let data1(arg)
if IsNumeric(arg) then
pdata1 = arg
else
msgbox("数値ではありません")
end if
end property
public property Get data1()
data1 = pdata1
end property
public function outMsg(arg)
select case arg
case 1
msgbox("1 is " & pdata1)
case 2
msgbox("2 is " & pdata2)
case 3
msgbox("3 is " & data3)
end select
end function
end class
sampleclassというクラスを宣言して、その動作をみてみます。クラスは set 変数名 = new クラス名 という形式で使用を開始します。 以降は set 変数名 で指定した変数名に .をつけてプロパティ(値)とメソッド(内部関数)にアクセスすることになります。 このサンプルクラスにはプロパティが3つ(pdata1、pdata2、data3)そしてアクセスできるメソッドが1つ(outMsg)あります。 VBScriptのクラスにおけるコンストラクタ(クラス作成時に自動で呼び出される関数)とデストラクタ(クラス廃棄時に自動で呼び出される関数)はそれぞれ class_initialize 、 class_terminate と名前付けします。 この二つは subプロシージャとなります。
プロパティはクラス内に設定値等を保持できる等使い道のある機能です。ようは変数なんですが、メソッドも同じですが public か private かの指定を行えます。 これはアクセスの権限を示すものです。public であればクラス外からもアクセスが可能(オブジェクト名.プロパティ or メソッド)ですが、privateの場合はクラス外からのアクセスはできません。 privateにはクラス内からのみアクセスする事になります。上記でいえば プロパティの pdata2 は private 指定を受けているので、コンストラクタ内では pdata2 = 20 とできますが、 外部から sc.pdata2 = 20 とするとエラーが発生します。外部からいじられたくない変数等はこのようにして隠蔽する事でクラスの扱いは格段に安心確実になります。
クラス内にはそれ以外に property という宣言も見られます。これはそのままプロパティの宣言になります。 これを使用することで、値に格納する際にその処理を規定することができます。 上記の例では
public property Let data1(arg)
if IsNumeric(arg) then
pdata1 = arg
else
msgbox("数値ではありません")
end if
end property
public property Get data1()
data1 = pdata1
end property
となっています。外部からは オブジェクト名.data1 というプロパティがあるように見えます。
ここでは pdata1 はprivate にしているので外部からのアクセスはできません。
そこでpropertyを利用しています。data1に渡された値をここでチェックを行っています(property let)。渡された値が数値かどうかをisNumeric関数で判定しています。
数値の場合のみ private の pdata1 に格納し、違う場合はエラー表示をおこなっています。
property getは値を取得する際に処理される項目です。上記の例ではただ単に値を返しているだけです。このようにして propertyを使用たりしてサニタイズを行う事によってクラスの堅牢性は飛躍的に増すことでしょう。
上記のコードを実行した場合、ダイアログは3つ出力されるかと思います。 クラス内のプロパティを表示するようになっています。 data3 は public 指定なので sc.data3 = 30 で値が変更できています。 pdata1 は private 指定ですが、property let によって バイパスされていますので、 data1 = 100 とすることで pdata1 に値が設定されています。 唯一 pdata2 だけが外部からアクセス手段を持ちませんので、コンストラクタ内で指定された20という値を外部から変更する事はできません。 クラス内のメソッド(関数)としては outMsg が用意されています。 オブジェクト名.メソッド とすることで関数にアクセスできます(publicの場合)。
2008年 10月 9日ドキュメント作成
2008年 10月 9日ドキュメント更新