<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Polymorphie_%28Programmierung%29</id>
	<title>Polymorphie (Programmierung) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Polymorphie_%28Programmierung%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Polymorphie_(Programmierung)&amp;action=history"/>
	<updated>2026-05-25T18:46:34Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Polymorphie_(Programmierung)&amp;diff=105644&amp;oldid=prev</id>
		<title>imported&gt;Trustable: Änderung 248232265 von Dlanold rückgängig gemacht; Kein BKH, da BKL-Typ 1 mit Klammerlemma.</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Polymorphie_(Programmierung)&amp;diff=105644&amp;oldid=prev"/>
		<updated>2024-09-01T17:46:08Z</updated>

		<summary type="html">&lt;p&gt;Änderung &lt;a href=&quot;/index.php/Spezial:Diff/248232265&quot; title=&quot;Spezial:Diff/248232265&quot;&gt;248232265&lt;/a&gt; von &lt;a href=&quot;/index.php/Spezial:Beitr%C3%A4ge/Dlanold&quot; title=&quot;Spezial:Beiträge/Dlanold&quot;&gt;Dlanold&lt;/a&gt; rückgängig gemacht; Kein BKH, da BKL-Typ 1 mit Klammerlemma.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Polymorphie&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Polymorphismus&amp;#039;&amp;#039;&amp;#039; ({{elS}} für &amp;#039;&amp;#039;Vielgestaltigkeit&amp;#039;&amp;#039;) ist ein Konzept in der [[Objektorientierte Programmierung|objektorientierten Programmierung]], das ermöglicht, dass ein [[Bezeichner]] abhängig von seiner Verwendung [[Objekt (Programmierung)|Objekte]] unterschiedlichen [[Datentyp|Datentyps]] annimmt. In älteren [[Typisierung (Informatik)|typisierten]] [[Programmiersprache|Programmiersprachen]] wird dagegen jedem Namen und jedem Wert im [[Quelltext]] eines [[Computerprogramm|Programms]] höchstens ein Typ zugeordnet. Dies bezeichnet man als &amp;#039;&amp;#039;Monomorphie&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Arten der Polymorphie ==&lt;br /&gt;
=== Polymorphie überladener Operatoren ===&lt;br /&gt;
Ein [[Bezeichner]], der für einen [[Operator (Mathematik)|Operator]] steht (bspw. „+“, „−“), kann mehrmals mit anderer Bedeutung implementiert werden. Für jeden Kontext, in dem der Operator neu deklariert wurde, muss die Implementierung immer eindeutig sein.&lt;br /&gt;
&lt;br /&gt;
=== Polymorphie der objektorientierten Programmierung ===&lt;br /&gt;
Die Polymorphie der objektorientierten [[Programmierung]] ist eine Eigenschaft, die immer im Zusammenhang mit [[Vererbung (Programmierung)|Vererbung]] und [[Schnittstelle (Objektorientierung)|Schnittstellen]] (Interfaces) auftritt. Eine Methode ist polymorph, wenn sie in verschiedenen Klassen die gleiche [[Signatur (Programmierung)|Signatur]] hat, jedoch erneut implementiert ist.&lt;br /&gt;
&lt;br /&gt;
Gibt es in einem Vererbungszweig einer Klassenhierarchie mehrere [[Methode (Programmierung)|Methoden]] auf unterschiedlicher Hierarchieebene, jedoch mit gleicher [[Signatur (Programmierung)|Signatur]], wird erst zur Laufzeit bestimmt, welche der Methoden für ein gegebenes Objekt verwendet wird ([[Dynamisches Binden]]). Bei einer mehrstufigen Vererbung wird jene Methode verwendet, die direkt in der Objektklasse (d.&amp;amp;nbsp;h. jene [[Klasse (Objektorientierung)|Klasse]], von der das [[Objekt (Programmierung)|Objekt]] ein Exemplar ist) definiert ist, oder jene, die im Vererbungszweig am weitesten „unten“ liegt (d.&amp;amp;nbsp;h. die Methode, die von der Vererbung her am nächsten ist).&lt;br /&gt;
&lt;br /&gt;
Moderne Konzepte kennen jedoch auch Polymorphie über Klassengrenzen hinaus. So erlaubt die [[Programmiersprache]] [[Objective-C]] die Polymorphie zwischen zwei gleichnamigen [[Methode (Programmierung)|Methoden]], die in verschiedenen [[Klasse (Objektorientierung)|Klassen]] erstmals definiert sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
// NSObject kennt nicht -doSomething&lt;br /&gt;
@interface KlasseA : NSObject {&lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
- (void) doSomething;&lt;br /&gt;
@end&lt;br /&gt;
&lt;br /&gt;
@interface KlasseB : NSObject {&lt;br /&gt;
    …&lt;br /&gt;
}&lt;br /&gt;
- (void) doSomething;&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;objc&amp;quot;&amp;gt;&lt;br /&gt;
// irgendwo&lt;br /&gt;
id object = … // Ein Objekt einer beliebigen Klasse&lt;br /&gt;
[object doSomething]; // polymorph zwischen KlasseA und KlasseB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Subklasse-vor-Basisklasse-Regel gilt auch hier: Wenn die KlasseB zur KlasseC abgeleitet wird, würde die entsprechende Methode der KlasseC ausgeführt.&lt;br /&gt;
&lt;br /&gt;
=== Polymorphie einer Funktion bzw. Prozedur ===&lt;br /&gt;
Ist der Rückgabewert oder ein Argument einer [[Funktion (Programmierung)|Funktion]] polymorph, so heißt die Funktion polymorphe Funktion. Mit Hilfe polymorpher Funktionen kann die [[Generische Programmierung|Generizität]] von [[Datenstruktur|Datenstrukturen]] auch in [[Algorithmus|Algorithmen]] angewandt werden.&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;Informatik.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;Duden.&amp;#039;&amp;#039; Mannheim 2001, ISBN 978-3-411-10023-1, S. 496.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Polymorphie von Datentypen oder Klassen ===&lt;br /&gt;
Wird für eigene [[Datentyp|Datentypen]] bzw. [[Klasse (Objektorientierung)|Klassen]] bei der Instanziierung bzw. beim Konstruktoraufruf ein [[Parameter (Informatik)|Parameter]] für den tatsächlich verwendeten [[Datentyp]] übergeben, spricht man von &amp;#039;&amp;#039;parametrischer Polymorphie&amp;#039;&amp;#039;, welche semantisch mit [[Generische Programmierung|Generizität]] übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
== Weitere Unterteilungen ==&lt;br /&gt;
Folgende weitere Unterteilung ist möglich:&lt;br /&gt;
* universelle Polymorphie&lt;br /&gt;
** parametrische Polymorphie&lt;br /&gt;
** Inklusions-/Vererbungspolymorphie&lt;br /&gt;
* Ad-hoc-Polymorphie&lt;br /&gt;
** Coercion&lt;br /&gt;
** Überladung&lt;br /&gt;
&lt;br /&gt;
Manchmal wird Ad-hoc-Polymorphie gleichgesetzt mit [[Überladen]]. Das ist auf [[Christopher Strachey]] zurückzuführen,&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;Fundamental concepts in programming languages.&amp;#039;&amp;#039; Lecture notes for International Summer School in Computer Programming, Copenhagen, August 1967.&amp;lt;/ref&amp;gt; der als Erster Polymorphie in parametrische und Ad-hoc-Polymorphie unterteilte.&lt;br /&gt;
&lt;br /&gt;
Luca Cardelli und Peter Wegner erweiterten Stracheys Konzept um die Inklusionspolymorphie,&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;On Understanding Types, Data Abstraction, and Polymorphism.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;ACM Computing Surveys.&amp;#039;&amp;#039; Band 17, Nr. 4, 1985, S. 471–522.&amp;lt;/ref&amp;gt; um Subtypen und Vererbung zu modellieren. Die obige Auflistung spiegelt also Stracheys Einteilung wider, erweitert um die Inklusionspolymorphie von Cardelli und Wegner.&lt;br /&gt;
&lt;br /&gt;
=== Universelle und Ad-hoc-Polymorphie ===&lt;br /&gt;
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 angehören. Diese sind zudem während der [[Kompilierung]] bekannt. Universelle Polymorphie dagegen erlaubt es, jedweden bekannten Typ zuzuordnen; auch solche, die vielleicht erst später definiert werden.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Unterschied liegt darin, dass die Implementierung einer universell-polymorphen Funktion generell den gleichen Code unabhängig von den Typen ihrer Argumente ausführt, während ad-hoc-polymorphe (also überladene) Funktionen abhängig von den Typen ihrer Argumente völlig unterschiedlich implementiert sein können.&lt;br /&gt;
&lt;br /&gt;
=== Überladen und Coercion ===&lt;br /&gt;
[[Funktion (Programmierung)|Funktionen]] sind [[überladen]], wenn unterschiedliches Verhalten mit demselben Namen verbunden ist. Dies gilt analog für Bezeichner von Operatoren: Beispielsweise ist der [[Operator (Mathematik)|Operator]] + in vielen [[Programmiersprache|Programmiersprachen]] von vornherein überladen. So können mit ihm sowohl ganze Zahlen als auch Gleitkommazahlen addiert werden. Oft wird er auch zur [[Konkatenation (Wort)|Stringkonkatenierung]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 42 + 3              (1)&lt;br /&gt;
 3.14 + 1.0          (2)&lt;br /&gt;
 &amp;quot;Hallo&amp;quot; + &amp;quot; Welt!&amp;quot;  (3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige [[Programmiersprache|Programmiersprachen]] unterscheiden dabei, welche Namen [[überladen]] werden dürfen und welche nicht. In [[Java (Programmiersprache)|Java]] ist Methodenüberladung erlaubt, Operatorüberladung außer den schon eingebauten Überladungen wie der des +-Operators aber nicht. Auch in [[C-Sharp|C#]] sind nicht alle Operatoren überladbar. [[C++]] und manche andere Sprachen erlauben generell beides.&lt;br /&gt;
&lt;br /&gt;
Coercion ist eine Art implizite [[Typumwandlung]], sozusagen das Anwenden einer unsichtbaren, automatisch eingefügten Funktion, um zum Beispiel Argumente eines Unterprogramms oder einer Funktion in die erwarteten Typen umzuwandeln. Coercion ist mit dem Überladen eng verknüpft, und die Unterschiede sind für den Programmierer nicht unbedingt gleich ersichtlich.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 3.14 + 2            (4)&lt;br /&gt;
 3 + 2.14            (5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In einer Sprache könnte der Additionsoperator lediglich für zwei reelle Zahlen definiert sein. Coercion würde dann dafür sorgen, dass [[Ganze Zahl|ganze Zahlen]] zuerst in [[Gleitkommazahl|Gleitkommazahlen]] umgewandelt werden. In (4) und (5) würde dann Coercion zum Einsatz kommen. Es ist aber auch denkbar, dass der Additionsoperator für mehrere Varianten definiert ist.&lt;br /&gt;
&lt;br /&gt;
Bei der Überladung handelt es sich offenbar nicht um eine echte Form von Polymorphie, da man sich vorstellen könnte, der [[Compiler]] werde die Uneindeutigkeit durch die mehrfache Benutzung eines Symboles zur Kompilationszeit wieder auflösen. Wir erlauben also nur einem Symbol, verschiedene (funktionsartige) Werte zu denotieren, die allerdings unterschiedliche und möglicherweise zueinander inkompatible Typen haben.&lt;br /&gt;
&lt;br /&gt;
Mit Coercions verhält es sich ähnlich. Man könnte meinen, ein [[Operator (Mathematik)|Operator]] akzeptiere Operanden verschiedenen Typs (wie das + oben), jedoch müssen die Typen erst für den Operator gewandelt werden. Der Ausgabetyp des Operators hängt also nicht mehr mit den Typen der Operanden zusammen (oder nur partiell), daher kann keine echte Polymorphie vorliegen.&lt;br /&gt;
&lt;br /&gt;
=== Parametrische Polymorphie ===&lt;br /&gt;
Parametrisierte Polymorphie repräsentiert Typen, deren Definitionen Typvariablen enthalten. In [[Java (Programmiersprache)|Java]] spricht man auch von [[Generischer Typ|generischen Typen]] oder {{lang|en|&amp;#039;&amp;#039;Generics&amp;#039;&amp;#039;}}. Die meisten modernen objektorientierten Programmiersprachen unterstützen parametrische Typdefinitionen, darunter auch [[Strongtalk]] (eine Variante von [[Smalltalk (Programmiersprache)|Smalltalk]] mit Typsystem), [[C-Sharp|C#]] oder [[Eiffel (Programmiersprache)|Eiffel]]. In [[C++]] können generische Typen mit Hilfe sogenannter [[Template (Programmierung)|Templates]] nachgebildet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&lt;br /&gt;
* monomorph&lt;br /&gt;
:&amp;lt;code&amp;gt;TYPE iContainer IS ARRAY OF INTEGER;&amp;lt;/code&amp;gt;&lt;br /&gt;
* polymorph durch Typvariable&lt;br /&gt;
:&amp;lt;code&amp;gt;TYPE Stack IS ARRAY OF [TYPVARIABLE]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beschränkter parametrischer Polymorphismus ====&lt;br /&gt;
Man unterscheidet grundsätzlich&lt;br /&gt;
* einfachen parametrischen Polymorphismus und&lt;br /&gt;
* beschränkten parametrischen Polymorphismus.&lt;br /&gt;
&lt;br /&gt;
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 ausführbar sein soll, seine Typvariable dann aber mit einem nichtnumerischen Typen belegt, so würde es zu Laufzeitfehlern kommen. In der Regel verwendet man daher beschränkte parametrische Typen, die für ihre Typvariablen eine Beschränkung auf bestimmte Typen angeben. In Strongtalk wird hierzu bspw. die Typvariable mittels &amp;#039;&amp;#039;T &amp;lt; Supertyp&amp;#039;&amp;#039; angegeben, wobei Supertyp die Einschränkung der Typen angibt, die in die Typvariable T eingesetzt werden können. Java ermöglicht die Angabe solcher Einschränkungen mittels der Schreibweise &amp;#039;&amp;#039;&amp;lt;T extends Supertyp&amp;gt;&amp;#039;&amp;#039;. In C# gibt es verschiedene Arten von Einschränkungen (&amp;quot;Constraints&amp;quot;), die man für einen Typparameter verlangen kann: Abgeleitet von einer bestimmten Basisklasse, Vorhandensein eines bestimmten Interfaces oder eines parameterlosen Konstruktors sowie weitere. Kombinationen mehrerer Constraints sind möglich, die dann alle erfüllt sein müssen.&lt;br /&gt;
&lt;br /&gt;
=== Inklusionspolymorphie ===&lt;br /&gt;
Inklusionspolymorphie bezeichnet die Eigenschaft, jede Methode statt auf einem Subtyp auch auf einem Basistypen ausführen zu können. Subtyping ist demnach eine Form der Inklusionspolymorphie.&lt;br /&gt;
&lt;br /&gt;
Man unterscheidet zwischen:&lt;br /&gt;
* Kompilationszeit-Polymorphie (statisches Binden)&lt;br /&gt;
*: Es kann zur Kompilationszeit der Typ des Objekts und somit die aufgerufene Funktion (auch „Methode“ genannt) bestimmt werden.&lt;br /&gt;
&lt;br /&gt;
* Laufzeit-Polymorphie ([[dynamisches Binden]]).&lt;br /&gt;
*: Erst zur [[Laufzeit (Informatik)|Laufzeit]] kann bestimmt werden, welche Methode aufzurufen ist (&amp;#039;&amp;#039;späte Bindung&amp;#039;&amp;#039;). Es kann also vom Programmlauf abhängig sein, welche Methode zur Anwendung kommt. Die Laufzeit-Polymorphie ist einer der wichtigsten Bestandteile der [[Objektorientierte Programmierung|objektorientierten Programmierung]] und wurde zuerst in der Programmiersprache [[Smalltalk (Programmiersprache)|Smalltalk]] umgesetzt und zum Beispiel in [[Objective-C]] eingesetzt. Ein weiteres Beispiel für &amp;#039;&amp;#039;späte Bindung&amp;#039;&amp;#039; sind &amp;#039;&amp;#039;generische Methoden&amp;#039;&amp;#039; wie im [[Common Lisp Object System]].&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
Angenommen, eine Anwendung soll statistische Daten sowohl grafisch als auch schriftlich in Tabellenform darstellen. Außerdem soll es möglich sein, die Darstellungsmethoden über [[Plug-in]]s zu erweitern. Dann erlaubt das Konzept der Polymorphie über das &amp;#039;&amp;#039;VisualizationPlugin&amp;#039;&amp;#039; Interface jede beliebige Implementierung (hier &amp;#039;&amp;#039;GraphDisplayPlugin&amp;#039;&amp;#039;, &amp;#039;&amp;#039;TextDisplayPlugin&amp;#039;&amp;#039;, &amp;#039;&amp;#039;HistogramDisplayPlugin&amp;#039;&amp;#039;) aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Die Anwendung selbst muss bei neuen [[Plug-in|Plug-ins]] nicht geändert werden und kann diese einfach über das [[Schnittstelle (Objektorientierung)|Interface]] mit dem Aufruf von &amp;#039;&amp;#039;setData&amp;#039;&amp;#039; und &amp;#039;&amp;#039;display&amp;#039;&amp;#039; starten.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
interface VisualizationPlugin {&lt;br /&gt;
    public void setData(DisplayData data);&lt;br /&gt;
    public void display();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class GraphDisplayPlugin implements VisualizationPlugin {&lt;br /&gt;
    public void setData(DisplayData data) { /* set data to be displayed */ }&lt;br /&gt;
    public void display() { /* Show Data as Graph */ }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class TextDisplayPlugin implements VisualizationPlugin {&lt;br /&gt;
    public void setData(DisplayData data) { /* set data to be displayed */ }&lt;br /&gt;
    public void display() { /* Show Data as table */ }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class HistogramDisplayPlugin implements VisualizationPlugin {&lt;br /&gt;
    public void setData(DisplayData data) { /* set data and calculate history data */ }&lt;br /&gt;
    public void display() { /* Show history data as Graph */ }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das folgende Beispiel in der [[Programmiersprache]] [[C-Sharp|C#]] zeigt Subtyping für die [[Methode (Programmierung)|Methode]] &amp;#039;&amp;#039;berechneFlaecheninhalt()&amp;#039;&amp;#039;. Die [[Klasse (Objektorientierung)|Klassen]] &amp;#039;&amp;#039;Rechteck&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Dreieck&amp;#039;&amp;#039; implementieren die Methode, die das [[Interface]] &amp;#039;&amp;#039;Polygon&amp;#039;&amp;#039; deklariert. Die Methode &amp;#039;&amp;#039;gibFlaecheninhalt(Polygon polygon)&amp;#039;&amp;#039; kann die Implementierung der Methode &amp;#039;&amp;#039;berechneFlaecheninhalt()&amp;#039;&amp;#039; für jeden Subtyp des Interface &amp;#039;&amp;#039;Polygon&amp;#039;&amp;#039; (siehe [[abgeleitete Klasse]]) aufrufen.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
public interface Polygon&lt;br /&gt;
{&lt;br /&gt;
	double berechneFlaecheninhalt();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Rechteck : Polygon&lt;br /&gt;
{&lt;br /&gt;
	private double breite, hoehe;&lt;br /&gt;
	&lt;br /&gt;
	// Konstruktor&lt;br /&gt;
	public Rechteck(double breite, double hoehe)&lt;br /&gt;
	{&lt;br /&gt;
		this.breite = breite;&lt;br /&gt;
		this.hoehe = hoehe;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public double berechneFlaecheninhalt()&lt;br /&gt;
	{&lt;br /&gt;
		return breite * hoehe;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Dreieck : Polygon&lt;br /&gt;
{&lt;br /&gt;
	private double a, b, c;&lt;br /&gt;
	&lt;br /&gt;
	// Konstruktor&lt;br /&gt;
	public Dreieck(double a, double b, double c)&lt;br /&gt;
	{&lt;br /&gt;
		this.a = a;&lt;br /&gt;
		this.b = b;&lt;br /&gt;
		this.c = c;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public double berechneFlaecheninhalt()&lt;br /&gt;
	{&lt;br /&gt;
		// Formel des Heron für den Flächeninhalt des allgemeinen Dreiecks&lt;br /&gt;
		return 0.25 * Math.Sqrt((a + b + c) * (-a + b + c) * (a - b + c) * (a + b - c));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public static double gibFlaecheninhalt(Polygon polygon)&lt;br /&gt;
{&lt;br /&gt;
	return polygon.berechneFlaecheninhalt();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public static void Main(string[] args)&lt;br /&gt;
{&lt;br /&gt;
	double flaecheninhalt = gibFlaecheninhalt(new Rechteck(12, 16));  // flaecheninhalt = 192&lt;br /&gt;
	Console.WriteLine(&amp;quot;Das Rechteck hat den Flächeninhalt &amp;quot; + flaecheninhalt);&lt;br /&gt;
	&lt;br /&gt;
	flaecheninhalt = gibFlaecheninhalt(new Dreieck(4, 13, 15));  // flaecheninhalt = 24&lt;br /&gt;
	Console.WriteLine(&amp;quot;Das Dreieck hat den Flächeninhalt &amp;quot; + flaecheninhalt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Dynamische Bindung]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Luca Cardelli, Peter Wegner: [http://citeseer.ist.psu.edu/cardelli85understanding.html &amp;#039;&amp;#039;On Understanding Types, Data Abstraction, and Polymorphism.&amp;#039;&amp;#039;] In: &amp;#039;&amp;#039;ACM Computing Surveys.&amp;#039;&amp;#039; 4/17/1985. ACM Press, New York/NY, S. 471–522, {{ISSN|0360-0300}} [[doi:10.1145/6041.6042]].&lt;br /&gt;
* Thomas Letschert, FH Giessen-Friedberg – {{Webarchiv | url=http://velociraptor.mni.fh-giessen.de/Programmierung/ProgII-htmldir/node9.html | wayback=20050802082135 | text=Polymorphismus}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierkonzept]]&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Trustable</name></author>
	</entry>
</feed>