2010-11-27 15 views
1

Existe-t-il une interface que je peux implémenter pour permettre les comparaisons de base et les mathématiques comme un entier?Autoriser les maths à se produire sur les instances de ma classe

Par exemple, disons que je la classe suivante:

Public Class Something 
    Public SomeBigNumber as UInt64 
End Class 

Je voudrais faire quelque chose comme ceci:

Dim SomethingA, SomethingB, SomethingC as New Something 

.... 

If (SomethingA-SomethingB) > SomethingC Then 
    'Do stuff 
End If 

J'espérais pouvoir mettre en œuvre une interface (si c'est même le bon terme pour cela) qui retournerait le UInt64 contenu dans la classe pour la comparaison et les maths, si possible.

Pensées? Merci d'avance!

Répondre

4

Ce que vous cherchez à faire est appelé "operator overloading", qui vous permet de définir des opérateurs de comparaison et de mathématiques pour les types complexes (comme votre classe Something).

Par exemple, vous pouvez surcharger les opérateurs d'addition et de soustraction à partir de votre Something classe comme ceci:

Public Shared Operator +(ByVal val1 As Something, ByVal val2 As Something) As Something 
    ''#(calculate the sum of the two specified values) 
    Return New Something(val1.SomeBigNumber + val2.SomeBigNumber) 
End Operator 

Public Shared Operator -(ByVal val1 As Something, ByVal val2 As Something) As Something 
    ''#(calculate the difference of the two specified values) 
    Return New Something(val1.SomeBigNumber - val2.SomeBigNumber) 
End Operator 

Et vous pouvez écrire du code comme:

Dim newValue As Something = something1 + something2 


Vous pouvez également surcharger les opérateurs de comparaison (supérieur à, inférieur à, égal à, et tout le reste) presque de la même manière:

Public Shared Operator >(ByVal val1 As Something, ByVal val2 As Something) As Boolean 
    ''#(return True if the first value is larger, False otherwise) 
    Return (val1.SomeBigNumber > val2.SomeBigNumber) 
End Operator 

Public Shared Operator <(ByVal val1 As Something, ByVal val2 As Something) As Boolean 
    ''#(return True if the first value is smaller, False otherwise) 
    Return (val1.SomeBigNumber < val2.SomeBigNumber) 
End Operator 

Permettant d'écrire du code comme:

If something1 > something2 Then 
    MesssageBox.Show("The first value is larger.") 
Else 
    MessageBox.Show("The second value is larger.") 
End If 

Notez, cependant, que certains de ces opérateurs doivent être surchargées dans paires. Plus précisément:

  • = et <>
  • > et <
  • >= et <=
  • IsTrue et IsFalse
+0

Ceci est la réponse la plus utile et instructif que je l'ai lu dans les deux dernières semaines. Merci beaucoup, Cody! Vous avez solidement répondu à ma question. – Brad

+0

@Brad: De rien! Heureux d'avoir pu aider. –