Überladen
# Überladen

Überladen (von englisch overloading) bedeutet in der Softwareentwicklung das bewusste Etablieren von Polymorphien, sodass ein und dasselbe Sprachelement – Operatoren, Konstruktoren, Literale und dergleichen – unterschiedliche, aus dem Kontext hervorgehende Bedeutungen annehmen können. Das Überladen wird, da es sich um einen rein syntaktischen Mechanismus handelt, nach Strachey als Ad-hoc-Polymorphie betrachtet.

Nicht alle Programmiersprachen ermöglichen das Überladen, als Verfahren ist es insbesondere bei objektorientierten Programmiersprachen anzutreffen.

## Erläuterung an einem Beispiel

In vielen Programmiersprachen steht der Operator + für verschiedene, durchaus unterschiedliche, Operationen:

Im ersten Fall ist das erwartbare Ergebnis "3", also eine Integer-Addition, im zweiten "abcdef", also eine String-Konkatenation. Dies sind im Grunde zwei sehr unterschiedliche Operationen. Compiler oder Interpreter von Sprachen, die eine solche sogenannte Polymorphie erlauben, tun dies, indem sie die anzuwendende Methode (Addition oder Konkatenation) aufgrund des Datentyps der beteiligten Operanden auswählen.

Von Überladung spricht man nun, wenn eine solche Polymorphie nicht nur, wie im Falle des Beispiels, vorgefertigt in einer Sprache vorhanden ist, sondern darüber hinaus auch durch Sprachkonstrukte weitere solcher Polymorphien geschaffen werden können. Im obigen Beispiel etwa könnte die Sprache die Möglichkeit bieten, durch Programmtext eine zusätzliche Bedeutung des +-Operators für andere Datentypen (etwa Arrays) zu etablieren. (Dies wäre dann ein Beispiel für Operatorüberladung.)

## Methodenüberladung

Methodenüberladung liegt vor, wenn mehrere Methoden denselben Namen haben, sie aber verschiedene Parameter (engl. argument) erwarten. Welche Methode genau aufgerufen wird, wird dann bei jedem Aufruf anhand der Parameter und ihrer Datentypen automatisch vom Compiler bestimmt. Ein typisches Beispiel ist eine Methode, die sowohl Texte (Strings) als auch ganze Zahlen (Integer) auf dem Bildschirm ausgeben können soll. Beispiel aus Pascal:

Im Falle von Funktionen ist in manchen Sprachen auch die Überladung anhand des Ergebnis-Typs möglich.

Nachteil ist ein Verlust an Übersichtlichkeit und dass Probleme auftreten können, wenn nachträglich weitere Überladungen hinzugefügt werden (vgl. das unten verlinkte Wikibook).

### Abgrenzung

**Standardwerte**

Keine Methodenüberladung im eigentlichen Sinne ist der Standardwert (engl. default argument), welcher ebenfalls dazu führt, dass eine – allerdings dieselbe – Methode mit unterschiedlichen, nämlich unterschiedlich vielen, Parametern aufgerufen werden kann. Wird ein Parameter ausgelassen, wird hierbei stattdessen der Standardwert übergeben:

Methoden mit Standardwert können problemlos in überladene Methoden überführt werden. Obiger Quelltext ist funktional mit folgendem identisch:

Dies ist hilfreich in Sprachen, die Standardwerte nicht unterstützen, beispielsweise Java.

**Implizite Typumwandlungen**

Ebenfalls von der Methodenüberladung zu unterscheiden sind implizite Typumwandlungen. In vielen Programmiersprachen lässt sich eine einzelne Methoden, die einen Gleitkommawert (Real) als Wertparameter erwartet, auch mit einer ganzen Zahl (Integer) aufrufen. Eine implizite Typumwandlung ist bei einem Referenzparameter nicht möglich, da formale und tatsächliche Parameter übereinstimmen müssen:

Würde man im obigen Quelltext die folgende überladene Methode (und die overload-Direktive bei der vorhandenen Methode) ergänzen, wäre das Programm kompilierbar:

## Operatorüberladung

Seit jeher unterschieden die meisten Programmiersprachen, der mathematischen Tradition folgend, nicht zwischen den Operatorsymbolen (+, -, …) für Ganzzahl- (Integer‑) und Gleitpunktarithmetik (real, float). Zur bruchlosen Erweiterung einer Sprache um benutzerdefinierte Typen ist es hilfreich, die Operatorsymbole auch für benutzerdefinierte Typen überladen zu können.

Ein Beispiel für das Überladen des Operators + in C++:

In C++ lassen sich fast alle vorhandenen Operatoren überladen, was in den meisten Fällen sowohl über freistehende Funktionen (wie hier) als auch über Methoden erfolgen kann.

Ziel der Operatorüberladung ist die leichte Lesbarkeit des Quelltext, wobei stets beachtet werden sollte, inwieweit diese durch überladene Operatoren verbessert oder verschlechtert wird: Während beispielsweise (a + b) * c klar besser zu lesen ist als mal(plus(a, b), c) ist dies bei weitem nicht immer der Fall, insbesondere wenn die konkrete Überladung nicht weithin bekannten Konventionen folgt.

Zuletzt ist anzumerken, dass es sich bei Operatorenüberladung nur um syntaktischen Zucker handelt und es in aller Regel genau so möglich wäre die gewünschte Funktionalität auch durch normale Funktionen bzw. Methoden zu implementieren.

