Enumステートメントにて列挙型が定義できるようになっていますが、現状の仕様ではただ単に定数を羅列するだけの機能にとどまっています。AB5ではこの軟弱な列挙型機能を、タイプセーフであり、数値・文字列への相互変換が容易な機能へ拡張したいと思います。
まず、Enumステートメントどうのこうのという前に、すべての列挙型が継承する基底クラスを設計したいと思います。
Class EnumBase
m_Value As Long
m_Name As String
Public
Sub EnumBase(value As Long, name As String)
m_Value=value
m_Name=name
End Sub
Function ToString() As String
Return m_Name
End Function
Function Operator() As Long
Return m_Value
End Function
End Class
このEnumBaseはすべての列挙型が継承するクラスであり、数値と名前をプライベートメンバとして保有しています。ToStringメソッドで列挙子の名前を取得できるようになっています。
で、肝心のEnumステートメントですが、例えば、下記のようなコードがあったときにEnumBaseを継承し、列挙型クラスを自動生成するような機構をコンパイラに持たせます。
Enum test
a
b
End Enum
上記のようなソースコードは下記のクラスと等価の意味を持つことになります。
Class test
Inherits EnumBase
Public
Sub test()
EnumBase(1,"a")
End Sub
Sub test(value As Long, name As String)
EnumBase(value,name)
End Sub
Static a As test(1,"a")
Static b As test(2,"b")
Sub Operator= (value As Long)
Select Case value
Case 1
This=a
Case 2
This=b
Case Else
'error
End Select
End Sub
Sub Operator= (value As String)
Select Case value
Case "a"
This=a
Case "b"
This=b
Case Else
'error
End Select
End Sub
End Class
※静的メンバ・メソッドを定義するStatic修飾子は未実装ですのであしからず。
このような実装を行うと、列挙子は単なる整数の定数値ではなく、列記として一つのオブジェクトという扱いになります。列挙型オブジェクトをファイルから読み込んだり書き込んだりする場合は、演算子オーバーロード・ToStringメソッドにより、簡単に整数値やString型に変換できるようになります。
例えば、上記のtest列挙型オブジェクトには下記のような代入方法・参照方法があります。
Dim e As test
e=test.a
e="a"
e=1
Dim i As Long
i=e
Dim s As String
s=e.ToString()
ちなみに、Const定義の右辺値に列挙子を指定したいこともあるかと思うので、この機能は別途、コンパイラが提供することになります。
さて、この案、うまく行くのでしょうか・・・。
1. Static修飾子を有効にして静的メソッド・メンバを追加できるようにする
2. Enumステートメントをクラス定義に変換するモジュールを作成する
3. 定数として扱う列挙子データをコンパイラで管理する
これらの問題をクリアできれば、高機能な列挙型の未来は明るいかも☆あと、静的メンバオブジェクトはグローバル変数同様、利用の有無に関わらず、実行ファイルに含まれてしまうので、基本ライブラリに含まれる列挙型の関係で実行ファイルの最小サイズが肥大化する可能性があります。この問題は別途検討する必要がありそうです。
Recent Comments