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. 定数として扱う列挙子データをコンパイラで管理する

これらの問題をクリアできれば、高機能な列挙型の未来は明るいかも☆あと、静的メンバオブジェクトはグローバル変数同様、利用の有無に関わらず、実行ファイルに含まれてしまうので、基本ライブラリに含まれる列挙型の関係で実行ファイルの最小サイズが肥大化する可能性があります。この問題は別途検討する必要がありそうです。