Polymorphism (Informatik)

In der Informatik ist polymorphism eine Programmiersprache-Eigenschaft, die Werten verschiedener Datentypen erlaubt, mit einer gleichförmigen Schnittstelle behandelt zu werden. Das Konzept parametrischen polymorphism gilt sowohl für Datentypen als auch für Funktionen. Eine Funktion, die dazu bewerten oder auf Werte verschiedener Typen angewandt werden kann, ist als eine polymorphe Funktion bekannt. Ein Datentyp, der scheinen kann, eines verallgemeinerten Typs zu sein (z.B, eine Liste mit Elementen des willkürlichen Typs) wird polymorpher Datentyp wie der verallgemeinerte Typ benannt, von dem solche Spezialisierungen gemacht werden.

Es gibt mehrere im Wesentlichen verschiedene Arten von polymorphism, von denen zwei von Christopher Strachey 1967 ursprünglich informell beschrieben wurden. Wenn die Funktion verschiedene und potenziell heterogene Durchführungen abhängig von einer beschränkten Reihe individuell angegebener Typen und Kombination anzeigt, wird es ad hoc polymorphism genannt. Ad hoc wird polymorphism auf vielen Sprachen mit der Funktion und Methode-Überbelastung unterstützt.

Wenn der ganze Code ohne Erwähnung eines spezifischen Typs geschrieben wird und so durchsichtig mit einer Zahl von neuen Typen verwendet werden kann, wird es parametrischen polymorphism genannt. John C. Reynolds (und später Jean-Yves Girard) hat sich formell entwickelt dieser Begriff von polymorphism als eine Erweiterung auf die Lambda-Rechnung (hat die polymorphe Lambda-Rechnung oder System F genannt). Parametrischer polymorphism wird auf statisch getippten funktionellen Programmiersprachen weit unterstützt. In der objektorientierten Programmiergemeinschaft, das Verwenden parametrischen polymorphism programmierend, wird häufig allgemeine Programmierung genannt.

In der objektorientierten Programmierung Subtyp polymorphism oder Einschließung ist polymorphism ein Konzept in der Typ-Theorie, worin ein Name Beispiele von vielen verschiedenen Klassen anzeigen kann, so lange sie durch eine allgemeine Superklasse verbunden sind. Einschließung polymorphism wird allgemein durch das Subschreiben unterstützt, d. h. Gegenstände von verschiedenen Typen sind gegen Gegenstände eines anderen Typs (ihr Grundtyp (En)) völlig austauschbar und können so über eine allgemeine Schnittstelle behandelt werden.

Die Wechselwirkung zwischen parametrischem polymorphism und dem Subschreiben führt zu den Konzepten der begrenzten Quantifizierung und Kovarianz und Kontravarianz (oder Widersprüchlichkeit) von Typ-Konstrukteuren.

Geschichte

Formen von polymorphism

Ad hoc polymorphism

Chris Strachey hat den Begriff ad hoc polymorphism gewählt, um sich auf polymorphe Funktionen zu beziehen, die auf Argumente von verschiedenen Typen angewandt werden können, aber die sich verschieden abhängig vom Typ des Arguments benehmen, auf das sie (auch bekannt als Funktionsüberbelastung oder Maschinenbediener angewandt werden, der überlädt). Der Begriff "ad-hoc-" in diesem Zusammenhang ist nicht beabsichtigt, um Pejorativum zu sein; es bezieht sich einfach auf die Tatsache, dass dieser Typ von polymorphism nicht eine grundsätzliche Eigenschaft des Typ-Systems ist. Im Beispiel unten scheinen die Funktionen, allgemein über verschiedene Typen zu arbeiten, wenn sie auf die Beschwörungen schauen, aber werden betrachtet, zwei völlig verschiedene Funktionen durch den Bearbeiter für alle Absichten und Zwecke zu sein:

Programm Ad hoc;

Funktion trägt Bei (x, y: Ganze Zahl): Ganze Zahl;

beginnen Sie

Tragen Sie bei: = x + y

Ende;

Funktion trägt Bei (s, t: Schnur): Schnur;

beginnen Sie

Tragen Sie bei: = Concat (s, t)

Ende;beginnen Sie

Writeln (Tragen (1, 2)) Bei;

Writeln (tragen Bei ('Hallo', 'Welt!'));

Ende.

</Quelle>

Auf dynamisch getippten Sprachen kann die Situation als die richtige Funktion komplizierter sein, die angerufen werden muss, könnte nur in der Durchlaufzeit bestimmbar sein.

Parametrischer polymorphism

Parametrischer polymorphism erlaubt einer Funktion oder einem Datentyp, allgemein geschrieben zu werden, so dass er Werte identisch ohne abhängig von ihrem Typ behandeln kann. Parametrischer polymorphism ist eine Weise, eine Sprache ausdrucksvoller zu machen, während er noch volle statische Typ-Sicherheit aufrechterhält.

Parametrischer polymorphism ist in der funktionellen Programmierung allgegenwärtig, wo es häufig einfach "polymorphism" genannt wird. Das folgende Beispiel zeigt einen parametrisierten Listendatentyp und zwei parametrisch polymorphe Funktionen auf ihnen:

Datenliste = Lernt Null | (Haben Sie Schlagseite)

Länge:: Haben Sie-> Ganze Zahl Schlagseite

Länge-Null = 0

Länge (Lernt x xs), = 1 + Länge xs

Karte:: (-> b)-> Liste-> Liste b

Karte f Null = Null

Karte f (Lernt x xs), = Lernt (f x) (Karte f xs)

</Quelle>

Parametrischer polymorphism ist auch auf mehreren objektorientierten Sprachen verfügbar, wohin er unter dem Namen "generics" geht:

Benotungsliste

Klassenknoten

T elem;

Knoten

}\

Knoten

int Länge {... }\

}\

Liste

...

}\</Quelle>

Jede parametrisch polymorphe Funktion wird darin notwendigerweise eingeschränkt, was sie tun kann, an der Gestalt der Daten statt seines Werts arbeitend, zum Konzept von parametricity führend.

Subtyp polymorphism (oder Einschließung polymorphism)

Einige Sprachen verwenden die Idee von Subtypen, die Reihe von Typen einzuschränken, die in einem besonderen Fall von parametrischem polymorphism verwendet werden können. Auf diesen Sprachen, polymorphism (manchmal gekennzeichnet als dynamischer polymorphism) subtippend, erlaubt einer Funktion, geschrieben zu werden, um einen Gegenstand eines bestimmten Typs T zu nehmen, sondern auch richtig wenn passiert, ein Gegenstand zu arbeiten, der einem Typ S gehört, der ein Subtyp von T (gemäß dem Ersatz-Grundsatz von Liskov) ist. Diese Typ-Beziehung wird manchmal S &lt geschrieben;:T. umgekehrt, wie man sagt, ist T ein Supertyp von S-written T :&gt; S.

Zum Beispiel, wenn, und solche Typen dass :&gt sind; und :&gt; eine Funktion, die geschrieben ist, um einen Willen zu nehmen, arbeitet ebenso gut, wenn passiert, oder als wenn passiert, a. Der wirkliche Typ des Gegenstands kann vor Kunden in einen schwarzen Kasten verborgen, und über die Gegenstand-Identität zugegriffen werden.

Tatsächlich, wenn der Typ abstrakt ist, kann es nicht sogar möglich sein, Ihre Hände auf einen Gegenstand zu bekommen, dessen am meisten abgeleiteter Typ ist (sieh abstrakten Datentyp, abstrakte Klasse). Diese besondere Art der Typ-Hierarchie ist besonders im Zusammenhang des Schemas bekannt, Sprach-als ein numerischer Turm programmierend, und enthält gewöhnlich noch viele Typen.

Objektorientiertes Programmiersprache-Angebot, das polymorphism subtippt, verwendend (auch bekannt als Erbe) subklassifizierend. In typischen Durchführungen enthält jede Klasse, was einen virtuellen Tabellen-A Tisch von Funktionen genannt wird, die den polymorphen Teil der Klassenschnittstelle durchführen - und jeder Gegenstand einen Zeigestock zum "vtable" seiner Klasse enthält, die dann befragt wird, wann auch immer eine polymorphe Methode genannt wird. Dieser Mechanismus ist ein Beispiel:

  • spät bindend, weil virtuelle Funktionsanrufe bis zur Zeit der Beschwörung und dem nicht gebunden werden
  • einzelne Absendung (d. h., einzelnes Argument polymorphism), weil virtuelle Funktionsanrufe einfach durch das Durchschauen des vtable gebunden werden, der durch das erste Argument (der Gegenstand) zur Verfügung gestellt ist, so sind die Laufzeittypen der anderen Argumente völlig irrelevant.

Dasselbe geht für die meisten anderen populären Gegenstand-Systeme. Einige, jedoch, wie CLOS, stellen vielfache Absendung zur Verfügung, unter der Methode-Anrufe in allen Argumenten polymorph sind.

Im folgenden Beispiel machen wir Katzen und Hund-Subtypen von Tieren. Das Verfahren schreibt akzeptiert ein Tier, aber wird auch richtig arbeiten, wenn ein Subtyp dazu passiert wird:

abstrakte Klasse Animal {\

Schnur-Gespräch ;

}\

Klasse Cat erweitert Tier {\

Schnur-Gespräch {gibt "Miauen zurück!"; }\

}\

Klassenhund erweitert Tier {\

Schnur-Gespräch {gibt "Einschlag zurück!"; }\

}\

öffentliche Klasse MyClass {\

öffentliche statische Leere schreibt (Tier a) {\

System.out.println (a.talk );

}\

öffentliche statische leere Hauptsache {\

schreiben Sie (neue Cat );

schreiben Sie (neuer Hund );

}\}\</Quelle>

Siehe auch

Links


Medizinischer Ventilator / Lou Donaldson
Impressum & Datenschutz