Come? non ne parli?... ebbene si!, il tempo non me lo permette e gli argomenti sono tanti...
Operator Overloading vi permette di definire (e ridefinire) degli operatori da applicare a dei tipi da voi creati.
...e per l'ultima volta mi rispiego...
Public Class SetPoint
Public Temperature as Single
Public Sub New (value as Single)
Me.Temperature=value
End Sub
End Class
Quello che vorrei ottenere con questa classe è poter scrivere qualcosa tipo:
Dim T1 as new SetPoint(12.3)
Dim T2 as New SetPoint(11)
Dim T3 as SetPoint=T1+T2
Come ben sapete questo non è possibile in quanto l'operatore "+" non è definito per il tipo SetPoint.
Con VB 2005 si potrà aggiungere l'operatore in questo modo:
Public Class SetPoint
Public Temperature as Single
Public Sub New (value as Single)
Me.Temperature=value
End Sub
Public Shared Operator +(ByVal a As SetPoint,ByVal b As SetPoint) As SetPoint
Return New SetPoint(a.Temperature + b.Temperature)
End Operator
End Class
Fatto questo il codice compilerà correttamente.
Alcune precisazioni:
-Gli operatori sono statici (shared)
-Alcuni operatori devono essere definiti in coppia (> e <, = e <>, >= e <=, IsTrue e IsFalse)
-Per definire AndAlso vanno definiti gli operatori IsTrue e And
Altra cosa che mi piacerebbe fare è scrivere è:
Dim x as Double=T1
Per far questo devo definire un operatore di conversione, e notate che desidero che la conversione si Implicita (ovvero non voglio usare nessun CDbl(), CType(), Convert.ToXXX()).
Definire un operatore di conversione implicito significa aggiungere alla classe SetPoint
questa parte di codice:
Public Shared Widening Operator CType(ByVal a As SetPoint) As Double
Return Convert.ToDouble(a.Temperature)
End Operator
Notate l'uso di Widening e di CType
Per definire un operatore di conversione Esplicito come nel caso:
Dim y as Int32=CInt(T1)
Devo aggiungere alla mia classe:
Public Shared Narrowing Operator CType(ByVal a As SetPoint) As Int32
Return Convert.ToInt32(a.Temperature)
End Operator
Notate la keyword Narrowing che fa si che la conversione avvenga solo utilizzando l'opportuno operatore di conversione.
Su Widening e Narrowing avrei parecchie cose da dire... ;-)