VB8から新しく導入された概念の一つに、演算子のオーバーロードがあります。 書式はC#の場合とほとんど一緒で、Sharedなメソッドとして定義します。 演算子のオーバーロードを行うために、新しくOperatorキーワードが追加されています。 ここでは、簡単な例として複素数の実部と虚部をメンバ変数に持つ構造体Complexを定義し、複素数に対する四則演算を演算子のオーバーロードを用いることで各演算子で記述できるようにしてみます。

Sponsored Link

Imports System

Structure Complex

    Private r As Double
    Private i As Double

    Public Sub New(ByVal r As Double, ByVal i As Double)

        Me.r = r
        Me.i = i

    End Sub

    Public Property Real() As Double
        Get
            Return r
        End Get
        Set(ByVal value As Double)
            r = value
        End Set
    End Property

    Public Property Imaginary() As Double
        Get
            Return i
        End Get
        Set(ByVal value As Double)
            i = value
        End Set
    End Property

    Shared Operator +(ByVal x As Complex, ByVal y As Complex) As Complex

        Return New Complex(x.r + y.r, x.i + y.i)

    End Operator

    Shared Operator -(ByVal x As Complex, ByVal y As Complex) As Complex

        Return New Complex(x.r - y.r, x.i - y.i)

    End Operator

    Shared Operator *(ByVal x As Complex, ByVal y As Complex) As Complex

        Return New Complex(x.r * y.r - x.i * y.i, x.r * y.i + x.i * y.r)

    End Operator

    Shared Operator /(ByVal x As Complex, ByVal y As Complex) As Complex

        Dim l As Double = y.r ^ 2.0 + y.i ^ 2.0

        Return New Complex((x.r * y.r + x.i * y.i) / l, (x.i * y.r - x.r * y.i) / l)

    End Operator

    Public Overrides Function ToString() As String

        If 0.0 <= i Then

            Return String.Format("{0:F3} + i{1:F3}", r, i)

        Else

            Return String.Format("{0:F3} - i{1:F3}", r, -i)

        End If

    End Function

End Structure

Class OperatorOverloadSample

    Public Shared Sub Main()

        Dim c1 As New Complex(2, 3)
        Dim c2 As New Complex(4, 5)

        Console.WriteLine(c1)
        Console.WriteLine(c2)

        Console.WriteLine("c1 + c2 = {0}", c1 + c2)
        Console.WriteLine("c1 - c2 = {0}", c1 - c2)
        Console.WriteLine("c1 * c2 = {0}", c1 * c2)
        Console.WriteLine("c1 / c2 = {0}", c1 / c2)

    End Sub

End Class
実行結果
2.000 + i3.000
4.000 + i5.000
c1 + c2 = 6.000 + i8.000
c1 - c2 = -2.000 - i2.000
c1 * c2 = -7.000 + i22.000
c1 / c2 = 0.561 + i0.049

また、独自に定義したものに限らず、.NET Frameworkに用意されている幾つかの構造体でも演算子がオーバーロードされています。 例えばSystem.Drawing.Size構造体の場合について見てみるとこの例の通りです。

Imports System
Imports System.Drawing

Class OperatorOverloadSample

    Public Shared Sub Main()

        Dim sz1 As New Size(10, 20)
        Dim sz2 As New Size(50, 30)

        Console.WriteLine(sz1)
        Console.WriteLine(sz2)
        Console.WriteLine(sz1 + sz2)

    End Sub

End Class
実行結果
{Width=10, Height=20}
{Width=50, Height=30}
{Width=60, Height=50}

VB.NETでは.NET Frameworkで用意されている構造体等でオーバーロードされた演算子を使用することはできませんでしたが、VB8からはこの例のよう使用することができるようになっています。

オーバーロードできる演算子

VB8では次の演算子がオーバーロード可能です。

単項演算子
+, -, IsFalse, IsTrue, Not
二項演算子
+, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor
型変換
CType

IsFalse, IsTrueは新しく導入された演算子です。 詳細は追って説明します。