[OOP] Überladung von Operatoren | Addition, Subtraktion, ... von Klassen

    • VB.NET

      [OOP] Überladung von Operatoren | Addition, Subtraktion, ... von Klassen

      Hi,

      in diesem Tutorial wird beschrieben, wie man selbst erstellte Klassen mit einander oder anderen Datentypen addieren, subtrahieren, multiplizieren, ... kann.
      Die Voraussetzungen zum Verstehen dieses Tutorials sind Kenntnisse im OOP (Objektorientierten Programmieren).

      Operator
      Jeder Operator[+ - * / Mod IsTrue ...] ist eine Methode mit einer logisch nachvollziehbaren Anzahl an Parametern und wie in OOP bekannt ist, können Methoden überladen werden.
      Die Operatoren + - * / können auf zwei unterschiedliche Werte angewendet werden (bsp. 2 + 3), deshalb haben sie zwei Parameter (erster die 2, zweiter die 3), wobei andere Operatoren wie IsTrue nur einen haben. IsTrue(True) (Statt True kommt dann das Objekt hinein und in der Methode wird entschieden was zurückgegeben wird).

      Ich hoffe, damit ist klar geworden, woran man erkennt, wie viele Parameter ein Operator hat und auch ein wenig, wie ein Operator eigentlich funktioniert (das ein Operator eigentlich nur eine Methode ist).

      1. Klassendeklaration
      Beispielkalsse:

      VB.NET-Quellcode

      1. Public Class Bruch
      2. Sub New(ByVal Zähler As Double, ByVal Nenner As Double)
      3. Me.Zähler = Zähler
      4. Me.Nenner = Nenner
      5. End Sub
      6. Private _Zähler As Double
      7. Public Property Zähler As Double
      8. Get
      9. Return _Zähler
      10. End Get
      11. Protected Set(ByVal value As Double)
      12. _Zähler = value
      13. End Set
      14. End Property
      15. Private _Nenner As Double
      16. Public Property Nenner As Double
      17. Get
      18. Return _Nenner
      19. End Get
      20. Protected Set(ByVal value As Double)
      21. _Nenner = value
      22. End Set
      23. End Property
      24. Public ReadOnly Property AlsZahl As Double
      25. Get
      26. Return Zähler / Nenner
      27. End Get
      28. End Property
      29. Public ReadOnly Property AlsString As String
      30. Get
      31. Return Zähler & "/" & Nenner
      32. End Get
      33. End Property
      34. End Class


      Angenommen wir erstellen jetzt zwei Objekte von dieser Klasse namens a und b und addieren diese zu c:
      a As Bruch = new Bruch(1, 2)
      b As Bruch = new Bruch(2, 3)
      c As Bruch = a + b

      Dabei entsteht ein Fehler, weil der Debugger nicht weis wie er diese zwei Datentypen addieren soll.
      Um dem Programm diese Addition "beizubringen" muss man eine Methode deklarieren, das sieht in VB so aus.

      VB.NET-Quellcode

      1. 'Die Operatormethoden sind immer statisch (Shared).
      2. Public Shared Operator +(ByVal lhs As Bruch, ByVal rhs As Bruch) As Bruch
      3. 'Hier wird das Rückgabeobjekt erstellt und ausgerechnet.
      4. Dim nZähler As Double = (lhs.Zähler * rhs.Nenner) + (rhs.Zähler * lhs.Nenner)
      5. Dim nNenner As Double = lhs.Nenner * rhs.Nenner
      6. Return New Bruch(nZähler, nNenner)
      7. End Operator


      Wenn man jetzt c.AlsString ausgibt, bekommt man keine Ohrfeige vom Debugger mehr, sondern das Ergebnis 7/6 und bei c.AlsZahl 1.1666...

      Problematisch wird es dann erst bei folgender Rechnung:
      Dim i As Integer = 5
      Dim x As Bruch = c + i

      Hier muss der Debugger wiedermal weinen, er weis nicht, wie er einen Bruch mit einem Integer addieren soll. Für diesen Fall muss man den + Operator überladen und als Parameter statt Bruch Integer wählen und dann dementsprechend umkonvertieren.

      VB.NET-Quellcode

      1. Public Shared Operator +(ByVal lhs As Bruch, ByVal rs As Integer) As Bruch
      2. 'Hier wird der Integer zu einem Bruch konvertieren. (Zuerst zu Double weil dies der Datentyp der Eigenschaft ist und dann zum Bruch.)
      3. Dim rhs As New Bruch(Convert.ToDouble(rs), 1)
      4. Dim nZähler As Double = (lhs.Zähler * rhs.Nenner) + (rhs.Zähler * lhs.Nenner)
      5. Dim nNenner As Double = lhs.Nenner * rhs.Nenner
      6. Return New Bruch(nZähler, nNenner)
      7. End Operator


      Jetzt kann man zu einem Bruch auch negative und positive Ganzzahlen addieren, was ist aber, wenn man den Bruch zu einer Zahl addieren möchte?
      Also sowas: 2 + c
      Dan meckert der Debugger wieder rum, der Grund: Er findet keine Methode, welche zuerst den Parameter vom Typ Integer und dann vom Typ Bruch hat, deshalb muss man für solche Fälle wieder eine neue Operator + Methode schreiben, diesmal ist die anordnung der Parameter aber umgedreht.

      Damit man den Bruch mit allen Datentypen addieren kann, muss somit für jeden Datentyp so eine oder zwei (je nach dem) Methoden geschrieben werden.


      Zum Schluss noch deklarieren wir zwei neue Instanzen vom Typ Bruch:
      Dim br1 As New Bruch(1, 3)
      Dim br2 As New Bruch(3, 9)

      Vergleichen wir jetzt br1 mit br2 bekommen wir False(nicht identisch) zurück, wobei 1/3(0.333...) das selbe ist wie 3/9 (0.3333...), deshalb kann man wiederrum für solche Fälle noch denn = Operator überladen aber dadurch muss man automatisch auch den <> Operator überladen.)

      Info: Die Operatormethoden kommen in die Bruch Klasse.

      Ich hoffe jemand kann von diesem Tutorial was nützliches lernen :)