ソフトの砂場(VBで多態性)

最終更新日:2000年08月27日

まえがき

日経ソフトウェアの2000年9月号を見ていると、VBにimplementsというキーワードがあり、これを使えばインタフェースの継承により多態性を実現可能という記事がありました。これは知らなかったので、ちょっと確認してみました。

作る内容は?

簡単に実現するために、入力された数を整数と小数で表示します。小数の表示には、浮動小数点と固定小数点の表示を用意します。整数と小数を表現するオブジェクトの実現には、インタフェースの継承を用います。小数の表現形式のオブジェクトもインタフェースの継承を用い、これらの間は委譲の関係にします。小数を表現するオブジェクトは、数を表現するオブジェクトのインタフェースと、表現形式のオブジェクトを設定するインタフェースの2つを実装することになります。

実行結果

このプログラムは実行結果を見てもつまらないのですが、こんな感じ。一番上の入力に対し、それぞれの出力結果を示しています。

ソースコード

Form1.frm

Private Sub Command1_Click()
    Dim obj As Object
    Dim objNumber As CNumber
    Dim objPrint As CPrint
    Dim objPrintFunction As CPrintFunction

    Set obj = New CLong
    Set objNumber = obj
    objNumber.setValue (Text1.Text)
    Text2.Text = objNumber.printValue

    Set obj = New CDouble
    Set objNumber = obj
    Set objPrintFunction = obj
    Set objPrint = New CPrintFixed
    objPrintFunction.setPrintFunction objPrint
    objNumber.setValue (Text1.Text)
    Text3.Text = objNumber.printValue

    Set obj = New CDouble
    Set objNumber = obj
    Set objPrintFunction = obj
    Set objPrint = New CPrintFloat
    objPrintFunction.setPrintFunction objPrint
    objNumber.setValue (Text1.Text)
    Text4.Text = objNumber.printValue
End Sub

-----
CNumber.cls

Public Sub setValue(ByVal value_ As String)
End Sub

Public Function printValue() As String
End Function

---
CLong.cls

Implements CNumber

Private value As Long

Private Sub CNumber_setValue(ByVal value_ As String)
    value = CLng(value_)
End Sub

Private Function CNumber_printValue() As String
    CNumber_printValue = CStr(value)
End Function

---
CDouble.cls

Implements CNumber
Implements CPrintFunction

Private value As Double
Private printFunction As CPrint

Private Sub CNumber_setValue(ByVal value_ As String)
    value = CDbl(value_)
End Sub

Private Function CNumber_printValue() As String
    CNumber_printValue = printFunction.formatValue(value)
End Function

Private Sub CPrintFunction_setPrintFunction(printFunction_ As CPrint)
    Set printFunction = printFunction_
End Sub

---
CPrint.cls

Public Function formatValue(ByVal value_ As Double) As String
End Function

---
CPrintFixed.cls

Implements CPrint

Private Function CPrint_formatValue(ByVal value_ As Double) As String
    CPrint_formatValue = Format$(value_, "#.#######E+##")
End Function

---
CPrintFloat.cls

Implements CPrint

Private Function CPrint_formatValue(ByVal value_ As Double) As String
    CPrint_formatValue = Format$(value_, "####.####")
End Function

---
CPrintFunction.cls

Public Sub setPrintFunction(printFunction As CPrint)
End Sub

雑感

VB5からこういう機能が入っていたそうです。う〜ん、それを早く知っていたら、あれやこれをもっと別の実装にしたのですが・・・ 何にしても、Delphiの開発者がVBのグループに移っているようなので、次のバージョンではいろいろな点でマシになることを期待しています。


ホーム