整数以外の列挙体っぽいものは実現可能なのか
定数的なクラスを列挙体っぽく使う
前回、
クラスモジュールとProperty
を用いて、列挙体的な整数以外の定数が作れるのではないか、と述べたが、かなり浅はかな考えだったようだ。
列挙体の何が便利といって、たとえば、
Public Enum HogeHoge hoge foo bar End Enum
としておいて、
Public Sub ahoAho(ByVal hg As HogeHoge)
と引数のデータ型を列挙体名にしておけば、上掲のahoAho
プロシージャを呼ぶコードを書くときに、
このように入力候補が表示されるということである。
しかし、前回のようなやり方では、このようなことができない。
うーむ。
作戦変更
前回は、定数化したい要素(前回の場合はString
型の要素)を配列にぶち込んで、Property
から呼び出すようにした。
では、配列の添字部分を列挙体にしてはどうだろうか。
そのような考えで、前回のクラスモジュールを変更する。
リスト1 クラスモジュール
Option Explicit Public Enum KOWaruguchi '……(1)' Aho Boke Kasu Dekosuke SuttokoDokkoi End Enum Private Waruguchies_(4) As String Public Property Get Waruguchi( _ ByVal kindOfWaruguchi As KOWaruguchi) _ As String '……(2)' Waruguchi = Waruguchies_(kindOfWaruguchi) End Property Private Sub Class_Initialize() '……(3)' Waruguchies_(Aho) = "アホ" Waruguchies_(Boke) = "ボケ" Waruguchies_(Kasu) = "カス" Waruguchies_(Dekosuke) = "デコスケ" Waruguchies_(SuttokoDokkoi) = "スットコドッコイ" End Sub
変更点は3箇所。
まず、(1)の
Public Enum KOWaruguchi Aho Boke Kasu Dekosuke SuttokoDokkoi End Enum
で、Public
な列挙体を定義。Public
にしないと、エントリポイントの標準モジュールから呼べないので仕方ない。
(2)の
Public Property Get Waruguchi( _ ByVal kindOfWaruguchi As KOWaruguchi) As String Waruguchi = Waruguchies_(kindOfWaruguchi) End Property
では、引数の型を列挙体のKOWaruguchi
型に変更。どうでもいいけど、KOWaruguchi
というのは、Kind Of Waruguchi
を縮めたものです。
あとは、(3)の
Private Sub Class_Initialize() Waruguchies_(Aho) = "アホ" Waruguchies_(Boke) = "ボケ" Waruguchies_(Kasu) = "カス" Waruguchies_(Dekosuke) = "デコスケ" Waruguchies_(SuttokoDokkoi) = "スットコドッコイ" End Sub
コンストラクタ部で、配列の添字を列挙体で表現するようにした。意味があるかどうかは知りませんけど。
これで、「アホ
」、「ボケ
」、「カス
」、「デコスケ
」、「スットコドッコイ
」という五つの文字列をまとめたWaruguchi
クラスができた。
前回も述べたとおり、Attribute VB_PredeclaredId
の値をTrue
にしてあるので、Java
のString
クラスやMath
クラスのように使用することができる。
使ってみる
次のコードで使用実験。
リスト2 標準モジュール
Public Sub testClassConstant() Dim i As KOWaruguchi '……(1)' For i = Aho To SuttokoDokkoi '……(2)' Debug.Print Waruguchi.Waruguchi(i) '……(3)' Next End Sub
まあ、何ということもないコード。
リストを見ても、何のことかよくわからないと思うが、コード入力時には、クラスモジュール内に列挙体を組み込んだ効果が出ている。
たとえば、(1)で、変数「i
」をKOWaruguchi
型にしているおかげで、(2)の入力時、
For i =
まで打ち込むと、
というふうに、入力候補が表示される。
For i = Aho To
のときには、
こんなふうに何も表示されないので、便利なのかどうかは不明。
そもそも、アルファベット順に並べ替えられてしまうので、For
ループの範囲を指定するのに使うのが間違っているのだけれど。
あと、(3)を入力するときも、
Debug.Print Waruguchi.Waruguchi(
まで入力すると、
のように入力候補が表示される。この場合は「i
」と入力するだけなので、何の有難味もないけど。
実行結果
上記リスト2を実行する。
意図どおり。
終わりに
Waruguchi.Waruguchi
型とかに出来たら便利なのだろうけど。