Operatorüberladung in C# 👍 👎

C++-Entwickler werden sich freuen (oder auch nicht Smiley: winking) und PHP-Entwickler wohl größtenteils irritiert sein: C# unterstützt das Überladen von Operatoren für eigene Datentypen. Das ist nun natürlich nicht neu, aber gemeinhin eher selten eingesetzt. Das im Übrigen nicht ganz ohne Grund, aber dazu später mehr.

Was bedeutet das nun konkret? Nun, Operatoren dürften den meisten zumindest aus dem mathematischen Sprachgebrauch bekannt sein: "+" und "-" sind beispielsweise solche Operatoren. Und diese werden auch genau in diesem Sinne bei den meisten Programmiersprachen – so auch bei C# – verwendet, wenn es um das Rechnen mit numerischen Datentypen geht. Unter C# dient "+" darüber hinaus auch der Konkatenierung von Zeichenketten und außerdem dem Hinzufügen von Ereignis-Behandlungsroutinen (und "-" dem Entfernen).

Hier sehen wir schon, dass zumindest manche dieser Operatoren vom Kontext abhängige Bedeutungen besitzen können. Tatsächlich können wir ein solches Verhalten auch für eigene Klassen implementieren und werden dies nun exemplarisch auch angehen.

Insbesondere im mathematischen Bereich, wo Operatoren klar definierte und hinreichend bekannte Semantik besitzen, bieten sich eigene Operatoren an. Wir werden dazu eine einfache Klasse zur Intervallarithmetik – also dem Rechnen mit Intervallen – implementieren, welche uns die beiden binären Operatoren "+" und "-" für Objekte dieses Typs anbietet. Dazu entwickeln wir als erstes eine ganz normale Klasse, ergänzen diese jedoch um zwei spezielle öffentliche, statische Methoden für die Operationen:
Intervall-Klasse mit Operatorüberladung zur Addition und Subtraktion
0102030405060708091011121314151617181920212223242526
public class Interval {    public double X {        get;        set;    }
public double Y { get; set; }

public static Interval operator +(Interval a, Interval b) { return new Interval() { X = (a.X + b.X), Y = (a.Y + b.Y) }; }
public static Interval operator -(Interval a, Interval b) { return new Interval() { X = (a.X – b.Y), Y = (a.Y – b.X) }; }}
Wichtig bei den beiden speziellen Methoden, ist also die Kennzeichnung durch das Schlüsselwort operator, gefolgt vom entsprechenden Symbol.

Die Verwendung ist jetzt denkbar einfach und intuitiv:
Erzeugung zweier Intervalle und Addition dieser zu einem neuen Intervall
01020304050607080910111213
  // Intervalle erzeugenInterval a = new Interval() {    X = 1,    Y = 3};
Interval b = new Interval() { X = 2, Y = 4};
// Intervalle zu neuem Intervall addierenInterval c = (a + b);
Die Subtraktion verhält sich natürlich analog dazu, nur eben mit "-". Intuitiv sollte man beim Thema Operatorüberladung im Übrigen ernst nehmen und nicht nur aus persönlicher Motivation heraus betrachten. Auf jeden Fall sollte man widersprüchliche Definitionen zur allgemeinen Ansicht vermeiden (also: bitte aus "+" kein "-" machen und umgekehrt). Damit würde man nämlich den Vorteil der Übersichtlichkeit wieder völlig zunichtemachen. Insofern solltet ihr bei eigenen Implementierungen immer darauf achten, eine nachvollziehbare Semantik einzuhalten und den Entwickler darüber informieren. Ein sicherlich vorbildliches Beispiel sind die relationalen Operatoren der DateTime-Struktur.

Zum Schluss gilt noch zu berücksichtigen, dass nicht alle Operatoren überladen werden können und relationale Operatoren paarweise überladen werden müssen. Detailliertere Informationen dazu findet ihr selbstverständlich wie immer im MSDN.


Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche