今夜はライブラリ開発者の皆様に待っていただいている機能の一つ、プロパティの実装を行っています。

 VB.NETを見習って、Propertyステートメントを・・・となりそうですが、プロパティに関してはD言語の仕様を見習う形での実装を行いたいと考えています。

ABでプロパティを記述したときのソースコードのサンプルイメージを下記に示します。

'-------------------------------------------------------
' D言語の構文を参考にしたプロパティ構文の実装
' Note:  呼び出し解釈に柔軟性を持たせる
'-------------------------------------------------------

Class CTest
    m_label_str As String
    m_label_i As Long

    m_table[100] As Long
Public

    Function label() As String    'label.Getアクセサ
        Return m_label_str
    End Function
    Sub label(Value As String)    'label.Setアクセサ
        m_label_str=Value
    End Sub

    Function label() As Long    'label.Getアクセサ
        Return m_label_i
    End Function
    Sub label(Value As Long)    'label.Setアクセサ
        m_label_i=Value
    End Sub

    '配列要素を持たせたプロパティ
    Function table(e As Long) As Long    'label.Getアクセサ
        Return m_table[e]
    End Function
    Sub table(e As Long, Value As Long)    'label.Setアクセサ
        m_table[e]=Value
    End Sub
End Class

 ん!?これじゃ、普通のメソッドじゃん。プロパティじゃないじゃん。

 そう思われる方もいらっしゃるかと思いますが、実はABが実装しようとしているプロパティというのは、呼び出し側(代入・参照側)の解釈を一ひねりし、宣言側は従来のメソッド定義で事足りるようになっているのです。

具体的には代入先、参照先に期待するメンバが存在しなかったときに、コンパイラが下記のような解釈をするようにします。

Getアクセサ:
“a=obj.label” → “a=obj.label()”

Setアクセサ:
“obj.label=b” → “obj.label(b)”

さてさて、週末には実装が完了しますので、早速β版のパッケージングに入っていこうと思います。