整数以外の列挙体っぽいものは実現可能なのか

定数的なクラスを列挙体っぽく使う

前回、

akashi-keirin.hatenablog.com

クラスモジュールとPropertyを用いて、列挙体的な整数以外の定数が作れるのではないか、と述べたが、かなり浅はかな考えだったようだ。

列挙体の何が便利といって、たとえば、

Public Enum HogeHoge
  hoge
  foo
  bar
End Enum

としておいて、

Public Sub ahoAho(ByVal hg As HogeHoge)

と引数のデータ型を列挙体名にしておけば、上掲のahoAhoプロシージャを呼ぶコードを書くときに、

f:id:akashi_keirin:20181208200746j:plain

このように入力候補が表示されるということである。

しかし、前回のようなやり方では、このようなことができない。

うーむ。

作戦変更

前回は、定数化したい要素(前回の場合は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にしてあるので、JavaStringクラスや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 =

まで打ち込むと、

f:id:akashi_keirin:20181208200755j:plain

というふうに、入力候補が表示される。

For i = Aho To

のときには、

f:id:akashi_keirin:20181208200808j:plain

こんなふうに何も表示されないので、便利なのかどうかは不明。

そもそも、アルファベット順に並べ替えられてしまうので、Forループの範囲を指定するのに使うのが間違っているのだけれど。

あと、(3)を入力するときも、

Debug.Print Waruguchi.Waruguchi(

まで入力すると、

f:id:akashi_keirin:20181208200819j:plain

のように入力候補が表示される。この場合は「i」と入力するだけなので、何の有難味もないけど。

実行結果

上記リスト2を実行する。

f:id:akashi_keirin:20181208200829j:plain

意図どおり。

終わりに

Waruguchi.Waruguchi型とかに出来たら便利なのだろうけど。