www.wikidata.de-de.nina.az
Polymorphie oder Polymorphismus griechisch fur Vielgestaltigkeit ist ein Konzept in der objektorientierten Programmierung das ermoglicht dass ein Bezeichner abhangig von seiner Verwendung Objekte unterschiedlichen Datentyps annimmt In alteren typisierten Programmiersprachen wird dagegen jedem Namen und jedem Wert im Quelltext eines Programms hochstens ein Typ zugeordnet Dies bezeichnet man als Monomorphie Inhaltsverzeichnis 1 Arten der Polymorphie 1 1 Polymorphie uberladener Operatoren 1 2 Polymorphie der objektorientierten Programmierung 1 3 Polymorphie einer Funktion bzw Prozedur 1 4 Polymorphie von Datentypen oder Klassen 2 Weitere Unterteilungen 2 1 Universelle und Ad hoc Polymorphie 2 2 Uberladen und Coercion 2 3 Parametrische Polymorphie 2 3 1 Beschrankter parametrischer Polymorphismus 2 4 Inklusionspolymorphie 2 4 1 Beispiele 3 Siehe auch 4 Literatur 5 EinzelnachweiseArten der Polymorphie BearbeitenPolymorphie uberladener Operatoren Bearbeiten Ein Bezeichner der fur einen Operator steht bspw kann mehrmals mit anderer Bedeutung implementiert werden Fur jeden Kontext in dem der Operator neu deklariert wurde muss die Implementierung immer eindeutig sein Polymorphie der objektorientierten Programmierung Bearbeiten Die Polymorphie der objektorientierten Programmierung ist eine Eigenschaft die immer im Zusammenhang mit Vererbung und Schnittstellen Interfaces auftritt Eine Methode ist polymorph wenn sie in verschiedenen Klassen die gleiche Signatur hat jedoch erneut implementiert ist Gibt es in einem Vererbungszweig einer Klassenhierarchie mehrere Methoden auf unterschiedlicher Hierarchieebene jedoch mit gleicher Signatur wird erst zur Laufzeit bestimmt welche der Methoden fur ein gegebenes Objekt verwendet wird Dynamisches Binden Bei einer mehrstufigen Vererbung wird jene Methode verwendet die direkt in der Objektklasse d h jene Klasse von der das Objekt ein Exemplar ist definiert ist oder jene die im Vererbungszweig am weitesten unten liegt d h die Methode die von der Vererbung her am nachsten ist Moderne Konzepte kennen jedoch auch Polymorphie uber Klassengrenzen hinaus So erlaubt die Programmiersprache Objective C die Polymorphie zwischen zwei gleichnamigen Methoden die in verschiedenen Klassen erstmals definiert sind NSObject kennt nicht doSomething interface KlasseA NSObject void doSomething end interface KlasseB NSObject void doSomething end irgendwo id object Ein Objekt einer beliebigen Klasse object doSomething polymorph zwischen KlasseA und KlasseB Die Subklasse vor Basisklasse Regel gilt auch hier Wenn die KlasseB zur KlasseC abgeleitet wird wurde die entsprechende Methode der KlasseC ausgefuhrt Polymorphie einer Funktion bzw Prozedur Bearbeiten Ist der Ruckgabewert oder ein Argument einer Funktion polymorph so heisst die Funktion polymorphe Funktion Mit Hilfe polymorpher Funktionen kann die Generizitat von Datenstrukturen auch in Algorithmen angewandt werden 1 Polymorphie von Datentypen oder Klassen Bearbeiten Wird fur eigene Datentypen bzw Klassen bei der Instanziierung bzw beim Konstruktoraufruf ein Parameter fur den tatsachlich verwendeten Datentyp ubergeben spricht man von parametrischer Polymorphie welche semantisch mit Generizitat ubereinstimmt Weitere Unterteilungen BearbeitenFolgende weitere Unterteilung ist moglich universelle Polymorphie parametrische Polymorphie Inklusions Vererbungspolymorphie Ad hoc Polymorphie Coercion UberladungManchmal wird Ad hoc Polymorphie gleichgesetzt mit Uberladen Das ist auf Christopher Strachey zuruckzufuhren 2 der als Erster Polymorphie unterteilte und zwar in parametrische und Ad hoc Polymorphie Luca Cardelli und Peter Wegner erweiterten Stracheys Konzept um die Inklusionspolymorphie 3 um Subtypen und Vererbung zu modellieren Die obige Auflistung spiegelt also Stracheys Einteilung wider erweitert um die Inklusionspolymorphie von Cardelli und Wegner Universelle und Ad hoc Polymorphie Bearbeiten Universelle Polymorphie unterscheidet sich von Ad hoc Polymorphie in mehreren Aspekten Bei Ad hoc Polymorphie kann der einem Namen zugeordnete Wert nur endlich vielen verschiedene Typen angehoren Diese sind zudem wahrend der Kompilierung bekannt Universelle Polymorphie dagegen erlaubt es jedweden bekannten Typ zuzuordnen auch solche die vielleicht erst spater definiert werden Ein weiterer Unterschied liegt darin dass die Implementierung einer universell polymorphen Funktion generell den gleichen Code unabhangig von den Typen ihrer Argumente ausfuhrt wahrend ad hoc polymorphe also uberladene Funktionen abhangig von den Typen ihrer Argumente vollig unterschiedlich implementiert sein konnen Uberladen und Coercion Bearbeiten Funktionen sind uberladen wenn unterschiedliches Verhalten mit demselben Namen verbunden ist Beispielsweise ist der Operator in vielen Programmiersprachen von vornherein uberladen So konnen mit ihm sowohl ganze Zahlen als auch Gleitkommazahlen addiert werden Oft wird er auch zur Stringkonkatenierung verwendet 42 3 1 3 14 1 0 2 Hallo Welt 3 Einige Programmiersprachen unterscheiden dabei welche Namen uberladen werden durfen und welche nicht In Java ist Methodenuberladung erlaubt Operatoruberladung ausser den schon eingebauten Uberladungen wie der des Operators aber nicht Auch in C sind nicht alle Operatoren uberladbar C und manche andere Sprachen erlauben generell beides Coercion ist eine Art implizite Typumwandlung sozusagen das Anwenden einer unsichtbaren automatisch eingefugten Funktion um zum Beispiel Argumente eines Unterprogramms oder einer Funktion in die erwarteten Typen umzuwandeln Coercion ist mit dem Uberladen eng verknupft und die Unterschiede sind fur den Programmierer nicht unbedingt gleich ersichtlich Beispiel 3 14 2 4 3 2 14 5 In einer Sprache konnte der Additionsoperator lediglich fur zwei reelle Zahlen definiert sein Coercion wurde dann dafur sorgen dass ganze Zahlen zuerst in Gleitkommazahlen umgewandelt werden In 4 und 5 wurde dann Coercion zum Einsatz kommen Es ist aber auch denkbar dass der Additionsoperator fur mehrere Varianten definiert ist Bei der Uberladung handelt es sich offenbar nicht um eine echte Form von Polymorphie da man sich vorstellen konnte der Compiler werde die Uneindeutigkeit durch die mehrfache Benutzung eines Symboles zur Kompilationszeit wieder auflosen Wir erlauben also nur einem Symbol verschiedene funktionsartige Werte zu denotieren die allerdings unterschiedliche und moglicherweise zueinander inkompatible Typen haben Mit Coercions verhalt es sich ahnlich Man konnte meinen ein Operator akzeptiere Operanden verschiedenen Typs wie das oben jedoch mussen die Typen erst fur den Operator gewandelt werden Der Ausgabetyp des Operators hangt also nicht mehr mit den Typen der Operanden zusammen oder nur partiell daher kann keine echte Polymorphie vorliegen Parametrische Polymorphie Bearbeiten Parametrisierte Polymorphie reprasentiert Typen deren Definitionen Typvariablen enthalten In Java spricht man auch von generischen Typen oder Generics Die meisten modernen objektorientierten Programmiersprachen unterstutzen parametrische Typdefinitionen darunter auch Strongtalk eine Variante von Smalltalk mit Typsystem C oder Eiffel In C konnen generische Typen mit Hilfe sogenannter Templates nachgebildet werden Beispiel monomorphTYPE iContainer IS ARRAY OF INTEGER polymorph durch TypvariableTYPE Stack IS ARRAY OF TYPVARIABLE Beschrankter parametrischer Polymorphismus Bearbeiten Man unterscheidet grundsatzlich einfachen parametrischen Polymorphismus und beschrankten parametrischen Polymorphismus Letzterer behebt die Probleme der Typsicherheit die innerhalb von Typdefinitionen dadurch entstehen dass beim Erstellen der Typdefinition auf Grund der Parametrisierung noch nicht klar ist Objekte welchen Typs eigentlich Gegenstand der Typ Operationen des Protokolls der Methoden die Terminologie variiert hier je nach Programmiersprache sind Wird durch einen Typ beispielsweise eine numerische Operation definiert die auf den Elementen des Typs ausfuhrbar sein soll seine Typvariable dann aber mit einem nichtnumerischen Typen belegt so wurde es zu Laufzeitfehlern kommen In der Regel verwendet man daher beschrankte parametrische Typen die fur ihre Typvariablen eine Beschrankung auf bestimmte Typen angeben In Strongtalk wird hierzu bspw die Typvariable mittels T lt Supertyp angegeben wobei Supertyp die Einschrankung der Typen angibt die in die Typvariable T eingesetzt werden konnen Java ermoglicht die Angabe solcher Einschrankungen mittels der Schreibweise lt T extends Supertyp gt Inklusionspolymorphie Bearbeiten Inklusionspolymorphie bezeichnet die Eigenschaft jede Methode statt auf einem Subtyp auch auf einem Basistypen ausfuhren zu konnen Subtyping ist demnach eine Form der Inklusionspolymorphie Man unterscheidet zwischen Kompilationszeit Polymorphie statisches Binden Es kann zur Kompilationszeit der Typ des Objekts und somit die aufgerufene Funktion auch Methode genannt bestimmt werden Laufzeit Polymorphie dynamisches Binden Erst zur Laufzeit kann bestimmt werden welche Methode aufzurufen ist spate Bindung Es kann also vom Programmlauf abhangig sein welche Methode zur Anwendung kommt Die Laufzeit Polymorphie ist einer der wichtigsten Bestandteile der objektorientierten Programmierung und wurde zuerst in der Programmiersprache Smalltalk umgesetzt und zum Beispiel in Objective C eingesetzt Ein weiteres Beispiel fur spate Bindung sind generische Methoden wie im Common Lisp Object System Beispiele Bearbeiten Angenommen eine Anwendung soll statistische Daten sowohl grafisch als auch schriftlich in Tabellenform darstellen Ausserdem soll es moglich sein die Darstellungsmethoden uber Plug ins zu erweitern Dann erlaubt das Konzept der Polymorphie uber das VisualizationPlugin Interface jede beliebige Implementierung hier GraphDisplayPlugin TextDisplayPlugin HistogramDisplayPlugin aufzurufen Die Anwendung selbst muss bei neuen Plug ins nicht geandert werden und kann diese einfach uber das Interface mit dem Aufruf von setData und display starten interface VisualizationPlugin public void setData DisplayData data public void display class GraphDisplayPlugin implements VisualizationPlugin public void setData DisplayData data set data to be displayed public void display Show Data as Graph class TextDisplayPlugin implements VisualizationPlugin public void setData DisplayData data set data to be displayed public void display Show Data as table class HistogramDisplayPlugin implements VisualizationPlugin public void setData DisplayData data set data and calculate history data public void display Show history data as Graph Das folgende Beispiel in der Programmiersprache C zeigt Subtyping fur die Methode berechneFlaecheninhalt Die Klassen Rechteck und Dreieck implementieren die Methode die das Interface Polygon deklariert Die Methode gibFlaecheninhalt Polygon polygon kann die Implementierung der Methode berechneFlaecheninhalt fur jeden Subtyp des Interface Polygon siehe abgeleitete Klasse aufrufen public interface Polygon double berechneFlaecheninhalt public class Rechteck Polygon private double breite hoehe Konstruktor public Rechteck double breite double hoehe this breite breite this hoehe hoehe public double berechneFlaecheninhalt return breite hoehe public class Dreieck Polygon private double a b c Konstruktor public Dreieck double a double b double c this a a this b b this c c public double berechneFlaecheninhalt Formel des Heron fur den Flacheninhalt des allgemeinen Dreiecks return 0 25 Math Sqrt a b c a b c a b c a b c public static double gibFlaecheninhalt Polygon polygon return polygon berechneFlaecheninhalt public static void Main string args double flaecheninhalt gibFlaecheninhalt new Rechteck 12 16 flaecheninhalt 192 Console WriteLine Das Rechteck hat den Flacheninhalt flaecheninhalt flaecheninhalt gibFlaecheninhalt new Dreieck 4 13 15 flaecheninhalt 24 Console WriteLine Das Dreieck hat den Flacheninhalt flaecheninhalt Siehe auch BearbeitenDynamische BindungLiteratur BearbeitenLuca Cardelli Peter Wegner On Understanding Types Data Abstraction and Polymorphism In ACM Computing Surveys 4 17 1985 ACM Press New York NY S 471 522 ISSN 0360 0300 doi 10 1145 6041 6042 Thomas Letschert FH Giessen Friedberg Polymorphismus Memento vom 2 August 2005 im Internet Archive Einzelnachweise Bearbeiten Informatik In Duden Mannheim 2001 ISBN 978 3 411 10023 1 S 496 Fundamental concepts in programming languages Lecture notes for International Summer School in Computer Programming Copenhagen August 1967 On Understanding Types Data Abstraction and Polymorphism In ACM Computing Surveys Band 17 Nr 4 1985 S 471 522 Abgerufen von https de wikipedia org w index php title Polymorphie Programmierung amp oldid 233015712