ステップアップ Visual Basic 「演算子のオーバーロード」

演算子オーバーロードとは?

演算子について独自の演算操作を定義する実装方法です。この方法を用いると、独自に定義したクラスや構造体に対して、普段見慣れている"+"などの演算子を独自の演算操作のための演算子として利用できるようになります。

Public Shared その他修飾子 Operator 演算子(演算対象リスト) As 演算結果の型
End Operator

"Public"と"Shared"の2つの修飾子は必須です。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click

        Dim amount1 As New MedievalYen(3, 2)
        Dim amount2 As New MedievalYen(1, 3)
        Dim amount3 = amount1 + amount2

        amount1.Dump(ListBox1.Items)
        amount2.Dump(ListBox1.Items)
        amount3.Dump(ListBox1.Items)

        amount3 += New MedievalYen(1, 2)
        amount3.Dump(ListBox1.Items)

    End Sub

End Class

Public Class MedievalYen

    Public Property Ryou As Integer ' 両
    Public Property Bu As Integer ' 分

    ' コンストラクタ
    Public Sub New(ByVal r As Integer, ByVal b As Integer)
        Ryou = r
        Bu = b
    End Sub

    Public Overridable Sub Dump(ByVal target As IList)
        target.Add(
            String.Format("[MedievalYen] {0} 両 {1} 分", Ryou, Bu))
    End Sub

    Public Shared Operator +(ByVal op1 As MedievalYen,
                             ByVal op2 As MedievalYen) As MedievalYen
        Dim workRyo As Integer
        Dim WorkBu As Integer

        workRyo = op1.Ryou + op2.Ryou
        WorkBu = op1.Bu + op2.Bu
        workRyo += (WorkBu \ 4) ' 両へ繰り上げ計算
        WorkBu = WorkBu Mod 4 ' 端数のみ分にする
        Return New MedievalYen(workRyo, WorkBu)
    End Operator
End Class

"+"演算子などの演算操作があると、コンパイラは演算対象となる項目の数や型から、呼び出し可能な演算子の有無を確認します。
また、注意点として、演算子オーバーロードとして実装したメソッド本体は、クラスや構造体の構成メンバになりますが、引数または戻り値のいずれかに最低1個の型はそのクラスや構造体でなければなりません。