Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

14.10. Operator Overloading

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Expressies van enkele ingebouwde types kunnen reeds gebruikt worden als operanden van bepaalde operaties.
Zo kunnen Integer expressies bijvoorbeeld gebruikt worden als operanden voor de addition (+), multiplication (*) en equality ( =) operatoren
Visual Basic 2012 Broncode - Codevoorbeeld 389
Option Explicit On
Option Strict On
Class Example1
    Public Shared Sub Main()
        Dim value1 As Integer = 10
        Dim value2 As Integer = 20
        '
        Dim value3 As Integer
        value3 = value1 + value2
        Console.WriteLine(value3)
        '
        value3 = value1 * value2
        Console.WriteLine(value3)
        '
        Console.WriteLine(value1 = value2)
        Console.WriteLine(value1 <> value2)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
30
200
False
True

14.10.1. Binary Operators

Als je gelijkaardige operatoren ook wil gebruiken op expressies van je eigen datatypes dan kan je dit doen door die operatoren te overladen.
Visual Basic 2012 Broncode - Codevoorbeeld 390
Class Counter
    Public Sub New()
    End Sub
    Public Sub New(ByVal value As Integer)
        _Value = value
    End Sub
    Private _Value As Integer
    Public ReadOnly Property Value() As Integer
        Get
            Value = _Value
        End Get
    End Property
    Public Sub Raise()
        _Value += 1
    End Sub
    Public Overloads Shared Operator +(ByVal counter1 As Counter, _
                                       ByVal counter2 As Counter) As Counter
        Return New Counter(counter1.Value + counter2.Value)
    End Operator
    Public Shared Operator *(ByVal counter1 As Counter, _
                             ByVal counter2 As Counter) As Counter
        Return New Counter(counter1.Value * counter2.Value)
    End Operator
    Public Shared Operator =(ByVal counter1 As Counter, _
                             ByVal counter2 As Counter) As Boolean
        Return counter1.Value = counter2.Value
    End Operator
    Public Shared Operator <>(ByVal counter1 As Counter, _
                              ByVal counter2 As Counter) As Boolean
        Return counter1.Value <> counter2.Value
    End Operator
End Class
Class Example2
    Public Shared Sub Main()
        Dim counter1 As New Counter(5)
        Dim counter2 As New Counter(10)
        '
        Dim counter3 As Counter = counter1 + counter2
        Console.WriteLine(counter3.Value)
        '
        Dim counter4 As Counter = counter1 * counter2
        Console.WriteLine(counter4.Value)
        '
        Dim counter5 As New Counter(counter1.Value)
        Console.WriteLine(counter1 = counter2)
        Console.WriteLine(counter1 = counter5)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
15
50
False
True
Operator procedures hebben altijd access modifiers Public Shared.

Het operatorsymbool is steeds +, -, *, \, /, ^, &, Like, Mod, And, Or, Xor, Not, <<, >>, =, <>, <, <=, >, >=, CType, IsTrue of IsFalse.

Als de operator = overladen wordt, moet ook <> overladen worden.

Het Overloads keyword in de signatuur is optioneel, tenzij een overladen versie wordt gemaakt van een overgeërfde operator of een andere operator procedure met hetzelfde operatorsymbool (identifier) gedefinieerde is (net zoals bij "gewone" overloading dus).

Minstens 1 van de operanden (argumenten) van een binary operator moet van hetzelfde type zijn als het type waarin deze operand is gedefinieerd.

In tegenstelling tot gewone procedures kunnen operator procedures niet expliciet worden aangeroepen via de dotnotatie.

De overladen operator kan zelf ook nog eens overladen worden.
Visual Basic 2012 Broncode - Codevoorbeeld 391
Partial Class Counter
    Public Overloads Shared Operator +(ByVal counter As Counter, _
                                       ByVal value As Integer) As Counter
        Return New Counter(counter.Value + value)
    End Operator
End Class
Class Example3
    Public Shared Sub Main()
        Dim counter1 As New Counter(5)
        Dim value1 As Integer = 10
        '
        Dim counter3 As Counter = counter1 + value1
        Console.WriteLine(counter3.Value)
        '
        'Dim counter4 As Counter = value1 + counter1  ' (1) illegal
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
15
De operanden (van types Counter en Integer) kunnen niet van positie worden verwisseld.

14.10.2. Unary Operators

Unary operators werken op 1 operand.  De corresponderende operator procedure heeft bijgevolg ook slechts 1 parameter (van het definiërende type).
Visual Basic 2012 Broncode - Codevoorbeeld 392
Partial Class Counter
    Public Shared Operator -(ByVal counter As Counter) As Counter          ' (1)
        Return New Counter(-counter.Value)
    End Operator
    Public Shared Operator -(ByVal counter1 As Counter, _
                             ByVal counter2 As Counter) As Counter
        Return New Counter(counter1.Value - counter2.Value)
    End Operator
End Class
Class Example4
    Public Shared Sub Main()
        Dim counter1 As New Counter(5)
        Dim counter2 As Counter = -counter1
        Dim counter3 As Counter = counter1 - counter2
        Dim counter4 As Counter = counter1 - -counter2
        '
        Console.WriteLine(counter1.Value)
        Console.WriteLine(counter2.Value)
        Console.WriteLine(counter3.Value)
        Console.WriteLine(counter4.Value)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
5
-5
10
0

14.10.3. Conversion Operators

Indien je in je eigen type conversion operators definieert, kan je instanties van je type omzetten naar een ander type, dit via de CType functie.
Visual Basic 2012 Broncode - Codevoorbeeld 393
Partial Class Counter
    Public Shared Widening Operator CType(ByVal counter As Counter) As Integer
        Return counter.Value
    End Operator
    Public Shared Widening Operator CType(ByVal value As Integer) As Counter
        Return New Counter(value)
    End Operator
    Public Shared Widening Operator CType(ByVal counter As Counter) As Long
        Return counter.Value
    End Operator
    Public Shared Narrowing Operator CType(ByVal value As Long) As Counter
        Return New Counter(System.Convert.ToInt32(value))
    End Operator
End Class
Class Example5
    Public Shared Sub Main()
        Dim counter1 As New Counter(1)
        Dim value1 As Integer = CType(counter1, Integer) ' widening
        Console.WriteLine(value1)
        '
        Dim value2 As Integer = 2
        Dim counter2 As Counter = CType(value2, Counter) ' widening
        Console.WriteLine(counter2.Value)
        '
        Dim counter3 As New Counter(3)
        Dim value3 As Long = CType(counter3, Long)       ' widening
        Console.WriteLine(value3)
        '
        Dim value4 As Long = 4
        Dim counter4 As Counter = CType(value4, Counter) ' narrowing
        Console.WriteLine(counter4.Value)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
1
2
3
4
Het "operatorsymbol" (zeg maar de identifier van de operator procedure) is bij een conversion operator steeds CType.

"Widening" conversies zullen altijd slagen at runtime, zonder dat er informatie verloren gaat.  Bijvoorbeeld Integer naar Long.
Een omzetting naar String bijvoorbeeld zou altijd kunnen slagen.
Ook een omzetting van een afgeleid type naar een basistype wordt als widening beschouwd, het afgeleide type beschikt immers minstens over alle members waarover het basistype beschikt.

"Narrowing" conversies slagen niet altijd, of er kan bij het omzetten informatie verloren gaan.  Bijvoorbeeld Long naar Integer.
Een omzetting van een basistype naar een afgeleid type wordt ook als narrowing beschouwd.

Onthoud dat met Option Strict On narrowing conversies expliciet moeten gebeuren.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.