- Methodensignatur
-
Eine Signatur (oder Methodensignatur) definiert in der Programmierung die formale Schnittstelle einer Funktion. Sie besteht aus dem Namen der Funktion, der Anzahl, Reihenfolge und Typen ihrer Parameter und dem Typ des oder der Funktionsrückgabewerte.
Auch die Menge der Operatoren eines abstrakten Datentyps wird Signatur genannt.[1]
Inhaltsverzeichnis
Objektorientierung
In der objektorientierten Programmierung ist eine Signatur die formale Schnittstelle einer Methode.[2]
Signaturen spielen eine Rolle bei der Polymorphie, einem der grundlegenden Konzepte der Objektorientierung. In vielen Programmiersprachen kann eine Methode einer abgeleiteten Klasse die Methode einer Basisklasse genau dann überschreiben, wenn die Signaturen der beiden Methoden identisch sind.
Im folgenden Java-Beispiel sind die Signaturen der beiden Methoden gleich, ihre Implementierung ist jedoch unterschiedlich. Die Methode „
hello
“ hat in beiden Fällen die Signatur „String hello(String)
“, der Name des Parameters sowie der Inhalt der Methode sind irrelevant. Die Methode in der abgeleiteten Klasse kann also die Methode der Basisklasse überschreiben.class Basisklasse { String hello(String name) { return "Hallo " + name; } } class AbgeleiteteKlasse extends Basisklasse { String hello(String nordischerName) { return "Moin " + nordischerName; } }
Die Menge aller öffentlichen Signaturen definiert die Schnittstelle einer Klasse.
Überladen von Methoden
Soll eine Methode überladen werden, muss jede Version eine unterschiedliche Signatur besitzen. Dabei wird bei den meisten Programmiersprachen der Rückgabetyp nicht berücksichtigt, weil die andernfalls entstehende Mehrdeutigkeit sowohl die Verständlichkeit des Programms beeinträchtigen als auch den Arbeitsaufwand des Compilers deutlich erhöhen würde.
Interne Repräsentation in Programmiersprachen
Viele C++-Compiler bilden aus dem Namen einer Funktion oder Methode und der kodierten Signatur einen so genannten dekorierten Funktionsnamen. Dieser zusammengesetzte Name bildet das Linkersymbol. Damit kann verhindert werden, dass Funktionen mit gleichem Namen, aber unterschiedlicher Signatur durch den Linker fälschlicherweise miteinander verknüpft werden. Die Namen von Methoden enthalten zusätzlich noch den Klassennamen. Allerdings sind die dekorierten Funktionsnamen nur für den passenden Compiler/Linker zu interpretieren, wie folgendes Beispiel zeigt:
?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z
In der Programmiersprache Java existiert ebenfalls eine interne Repräsentation von Methodennamen, der so genannte method descriptor. Im Gegensatz zu C++ ist diese Teil der Sprachspezifikation und somit für alle Compiler und virtuellen Maschinen identisch. Das folgende Beispiel zeigt die interne Form der Signatur der Methode „
Object meineMethode(int i, double d, Thread t)
“.[3](IDLjava/lang/Thread;)Ljava/lang/Object;
Quellen
- ↑ R. Dumke: Einführung, Algorithmen und Datenstrukturen. Otto-von-Guericke-Universität Magdeburg
- ↑ Rebecca Wirfs-Brock, Brian Wilkerson, Lauren Wiener: Objektorientiertes Software-Design. Carl Hanser Verlag, München 1993, ISBN 3-446-16319-0
- ↑ Tim Lindholm, Frank Yellin: The JavaTM Virtual Machine Specification: Second Edition. Abschnitt 4.3.3 Method Descriptors.
Wikimedia Foundation.