多機能な列挙型
abdev 多機能な列挙型 はコメントを受け付けていません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