Signatur (Programmierung)

Signatur (Programmierung)

Eine Signatur (oder Methodensignatur) definiert in der Programmierung die formale Schnittstelle einer Funktion oder Prozedur. Sie besteht aus dem Namen der Funktion und der Anzahl und Reihenfolge der zuweisungskompatiblen Parameterdatentypen. Der Typ des Rückgabewerts gehört gelegentlich ebenfalls zur Signatur (siehe unten).

Auch die Menge der Operatoren eines abstrakten Datentyps wird Signatur genannt.[1]

Inhaltsverzeichnis

Rückgabetyp

In Pascal- und C-Abkömmlingen, und ähnlichen Sprachen, welche bei Überladungen den Rückgabetyp nicht berücksichtigen, kann nicht unterschieden werden, welche Methode im konkreten Anwendungsfall benutzt werden soll.

Beispiel:

    ...
     // Deklaration
    float  teile( int dividend, int divisor);    // die Signatur ist hier: teile( int, int )
    double teile (int a, int b);  // nicht erlaubt, Signatur ist dieselbe wie oben: teile( int, int )
    ...

Beide Methoden bzw. Funktionen oben hätten die gleiche Signatur.

     ...
     // Deklaration
     boolean isNegativ( float zahl );   // die Signatur ist isNegativ(float)
     boolean isNegativ( double zahl );  // in Ordnung, Signatur ist anders: isNegativ(double)
     ...

Jetzt könnte nicht mehr entschieden werden, welche Funktion teile (int, int) im konkreten Anwendungsfall benutzt werden soll:

      ...
    // Die obigen Funktionen sollen hier benutzt werden:
    boolean b = isNegativ( teile(x,y) );   // float teile(..) oder double teile(..) ?
     ...

Im Gegensatz dazu kann die Möglichkeit gegeben werden, in Ausdrücken explizit einen Typ anzugeben. Dadurch kann das Aufrufziel eindeutig angegeben werden. Haskell macht hiervon Gebrauch. Beispielsweise ergeben die Ausdrücke

    read "42" :: Integer

und

    read "42" :: Double

verschiedene Werte unterschiedlichen Typs.

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.

Überschriebene Methoden

Im folgenden Java-Beispiel scheinen die Methodensignaturen aus Oberklasse und abgeleiteter Klasse gleich zu sein: „String redeMit( String )“. Für den Compiler haben die Methoden jedoch unterschiedliche Signaturen, da er noch die zugehörigen Namensräume und Klassentypen berücksichtigt. Die Methode der abgeleiteten Klasse hat hier die Methode der Basisklasse überschrieben (englisch override). Hier ein Beispiel:

// Superklasse
class Person {
 
    String redeMit( String name ) {
      return "Hallo " + name;
    }
}
 
// Abgeleitete Klasse. Superklassenrelation impliziert Supertyprelation.
class NettePerson extends Person {
 
      // Methode redeMit(String) wird überschrieben
    String redeMit( String name ) {
        return "Schön Dich zu sehen, " + name;
    }
}
 
public class Main {
 
    public static void main( String args[] ) {
 
        Person p;
 
// Hier kann erst zur Laufzeit entschieden werden, welche Methode genommen werden soll.
        if ( 0.5 < Math.random() ) {
            p = new Person();        // originale Person p
        } else {
            p = new NettePerson();   // Person p wird mit "nettem" Verhalten instanziert.
        }
 
        for ( String name: args ) {
            System.out.println( p.redeMit( name ) + "." );
        }
    }
}

Zur Laufzeit führt jedes Objekt einen Zeiger auf eine Tabelle virtueller Methoden mit, die für jede Klasse existiert. Dieser Zeiger wird bei der Objekt-Instanzierung initialisiert und ermöglicht so Polymorphie, also überschreibbares Verhalten.

Unterklasse-Instanzen können gegebenenfalls noch mittels so genannter Superzeiger auf die überschriebenen Methoden ihrer Superklassen zugreifen.

Klassensignatur

Die Menge aller öffentlichen Signaturen definiert die Schnittstelle einer Klasse.

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 bzw. 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

  1. R. Dumke: Einführung, Algorithmen und Datenstrukturen. Otto-von-Guericke-Universität Magdeburg
  2. Rebecca Wirfs-Brock, Brian Wilkerson, Lauren Wiener: Objektorientiertes Software-Design. Carl Hanser Verlag, München 1993, ISBN 3-446-16319-0
  3. Tim Lindholm, Frank Yellin: The JavaTM Virtual Machine Specification: Second Edition. Abschnitt 4.3.3 Method Descriptors.

Wikimedia Foundation.

Игры ⚽ Нужно сделать НИР?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Signatur — (lat. signum „Zeichen“) steht für: eine Unterschrift: eine handschriftliche Unterschrift elektronische Signatur, in der Datenverarbeitung ein elektronischer Identitätsnachweis Signature, einen personalisierten Textabschnitt unter E Mails und… …   Deutsch Wikipedia

  • Vererbung (objektorientierte Programmierung) — Vererbung dargestellt mittels UML. Die abgeleitete Klasse hat die Attribute x und y und verfügt über die Methoden a und b (im UML Sprachgebrauch Operationen a und b). Die Vererbung (engl. Inheritance) ist eines der grundlegenden Konzepte der… …   Deutsch Wikipedia

  • Schnittstelle (objektorientierte Programmierung) — In der objektorientierten Programmierung (OOP) vereinbaren Schnittstellen (engl. Interface) gemeinsame Signaturen von Methoden oder Funktionen, welche in unterschiedlichen Klassen implementiert werden. Die Schnittstelle gibt an, welche Methoden… …   Deutsch Wikipedia

  • Aspekt-orientierte Programmierung — Die Artikel Aspektorientierte Programmierung und Cross Cutting Concern überschneiden sich thematisch. Hilf mit, die Artikel besser voneinander abzugrenzen oder zu vereinigen. Beteilige dich dazu an der Diskussion über diese Überschneidungen.… …   Deutsch Wikipedia

  • Überschreiben (objektorientierte Programmierung) — Der Begriff Überschreiben (engl. override, wörtlich außer Kraft setzen, überwinden) beschreibt eine Technik in der objektorientierten Programmierung, die es einer Unterklasse erlaubt, eine eigene Implementierung einer von der Oberklasse geerbten… …   Deutsch Wikipedia

  • Vererbung (Programmierung) — Vererbung dargestellt mittels UML. Die abgeleitete Klasse hat die Attribute x und y und verfügt über die Methoden a und b (im UML Sprachgebrauch Operationen a und b). Die Vererbung (engl. Inheritance) ist eines der grundlegenden Konzepte der… …   Deutsch Wikipedia

  • Polymorphie (Programmierung) — Polymorphie (griechisch, „Vielgestaltigkeit“) ist ein Konzept in Programmiersprachen, das die Fähigkeit eines Bezeichners beschreibt, abhängig von seiner Verwendung unterschiedliche Datentypen anzunehmen. Das Gegenteil der Polymorphie ist die… …   Deutsch Wikipedia

  • Schnittstelle (Programmierung) — Eine Schnittstelle (englisch interface) dient in der objektorientierten Programmierung der Vereinbarung gemeinsamer Signaturen von Methoden, welche in unterschiedlichen Klassen implementiert werden. Die Schnittstelle gibt dabei an, welche… …   Deutsch Wikipedia

  • Aspektorientierte Programmierung — (AOP) ist ein Programmierparadigma für die Objektorientierte Programmierung, um generische Funktionalitäten über mehrere Klassen hinweg zu verwenden (Cross Cutting Concern). Logische Aspekte eines Anwendungsprogramms werden dabei von der… …   Deutsch Wikipedia

  • Deklaration (Programmierung) — In der Informatik und Programmierung ist eine Deklaration die Festlegung von Dimension, Bezeichner, Datentyp und weiteren Aspekten einer Variablen oder eines Unterprogramms. Durch die Deklaration wird dem Übersetzer (Compiler oder Interpreter)… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”