Home » Tutorials » Object Pascal/RTL » Das Überladen von Operatoren

Das Überladen von Operatoren

Einleitung

Seit Delphi 2006 gibt es auch unter Anwendungen für Win32 die Möglichkeit, Operatoren zu überladen. Was bedeutet das nun aber konkret? Diejenigen, die sich bereits näher mit Delphi befasst haben, wissen, dass es die Möglichkeit gibt, Funktionen zu überladen. So hat man mehrere Funktionen, die zwar denselben Namen haben, jedoch unterschiedliche Typen als Parameter mitliefern und so u.U. auch unterschiedliche Arbeiten erfüllen. Das Überladen von Operatoren kann man sich ähnlich vorstellen. Es gibt die grundsätzlichen Operatoren (+,-,*,/,…), wie man sie am häufigsten für arithmetische Operationen von verschiedenen Typen verwendet. Auch diese sind, ohne dass man es merkt, bereits überladen. So ist es etwa möglich, die Addition auf zwei Integers anzuwenden, genauso kann man aber auch einen Integer mit einem Extended addieren. Das Prinzip beschränkt sich dabei sogar noch nicht einmal auf arithmetische Operationen. Als Beispiel sei hierzu die Verkettung zweier Strings genannt, die ebenfalls über den Operator + genutzt werden kann. Ein und derselbe Operator führt also verschiedene Arbeiten für verschiedene Typen aus. Die Möglichkeit, für seine eigenen Datentypen diese Features zu implementieren, möchten wir uns im Folgenden näher betrachten.
Hierbei mag der eine oder andere sich sicherlich fragen, wozu man das braucht. Notwendig ist es mit Sicherheit nicht, aber es macht den einen oder anderen Quellcode übersichtlicher und die eigenen Datentypen u.U. etwas angenehmer zu handhaben. Nehmen wir als Beispiel die Addition. Sagen wir, wir haben den Datentypen TMegaInt implementiert. TMegaInt sei dabei unsere eigene Implementierung eines selbst erweiternden Datentypen. Es handelt sich also um eine Art erweiterten Integer-Datentyp. Wie genau das funktioniert, ist jedoch für das Beispiel nicht weiter wichtig.

unit test;

interface
 type
 TMegaInt = record
 ...
 end;

Nun ließe sich mit Sicherheit die Addition dazu als Funktion implementieren.

function add(a, b: TMegaInt): TMegaInt;
begin
 ...
end;

Die Addition zweier TMegaInts ist dabei noch recht simpel. Aber die Addition dreier TMegaInts wird schon unangenehmer.

...
c := add(a, b);
...
c := add(c, add (a,b));
...

Auch der Schritt zu dynamischen Arrays o.ä. wäre keine adäquate Lösung. Schöner wäre es doch, einfach schreiben zu können:

...
c := c + a + b;
...

Dann würde sich Delphi auch selbst um die Rechenvorschriften (Punkt vor Strich etc.) kümmern. Wie das geht, zeigt dieses Tutorial.