<?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=Generische_Programmierung</id>
	<title>Generische 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=Generische_Programmierung"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Generische_Programmierung&amp;action=history"/>
	<updated>2026-05-22T08:22:35Z</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=Generische_Programmierung&amp;diff=13748&amp;oldid=prev</id>
		<title>imported&gt;RolandIllig: /* C */ Abschnitt entfernt, da die Implementierung mit Pointern unnötig kompliziert ist und auch nicht erläutert wird</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Generische_Programmierung&amp;diff=13748&amp;oldid=prev"/>
		<updated>2023-01-28T21:17:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;C: &lt;/span&gt; Abschnitt entfernt, da die Implementierung mit Pointern unnötig kompliziert ist und auch nicht erläutert wird&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Belege fehlen}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generische Programmierung&amp;#039;&amp;#039;&amp;#039; ist ein Verfahren zur Entwicklung wiederverwendbarer [[Programmbibliothek|Software-Bibliotheken]]. Dabei werden [[Funktion (Programmierung)|Funktionen]] möglichst allgemein entworfen, um sie für unterschiedliche [[Datentyp]]en und [[Datenstruktur]]en verwenden zu können.&lt;br /&gt;
&lt;br /&gt;
== Grundlegendes ==&lt;br /&gt;
Die Implementierung erfolgt bei einigen [[Programmiersprache]]n durch das Konzept [[generischer Typ]]en bzw. [[Template (C++)|Templates]] – so gestalten sich [[dynamische Programmiersprache]]n, bei denen sich der Typ einer Variable zur Laufzeit ändern darf, durch ihre verallgemeinerte [[Polymorphie (Programmierung)|Polymorphie]] generisch. Von Sprachen, die solche Mechanismen bieten, sagt man auch, dass sie &amp;#039;&amp;#039;&amp;#039;Generik&amp;#039;&amp;#039;&amp;#039; erlauben.&lt;br /&gt;
&lt;br /&gt;
Wesentlich bei der generischen Programmierung ist, dass die Algorithmen nicht für einen bestimmten [[Datentyp]] geschrieben werden, sondern nur bestimmte Anforderungen an die Typen stellen. Das Prinzip wird auch &amp;#039;&amp;#039;parametrische Polymorphie&amp;#039;&amp;#039; genannt.&lt;br /&gt;
&lt;br /&gt;
Paradebeispiel ist die [[C++-Standardbibliothek]] der Programmiersprache [[C++]], bei der die [[Algorithmus|Algorithmen]] so weit wie möglich von den Datenstrukturen, mit denen sie arbeiten, getrennt werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Ein Beispiel liefert die Maximum-Funktion&lt;br /&gt;
: &amp;lt;math&amp;gt;\max: T \times T \to T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
die für zwei gegebene Werte &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; desselben Typs den größeren Wert &amp;lt;math&amp;gt;\max\{a,b\}&amp;lt;/math&amp;gt; zurückgibt.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist, dass &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; miteinander vergleichbar sind, der Ausdruck &amp;lt;math&amp;gt;a \le b&amp;lt;/math&amp;gt; also definiert ist und eine [[Ordnungsrelation|Ordnung]] beschreibt.&lt;br /&gt;
&lt;br /&gt;
=== C++ ===&lt;br /&gt;
&lt;br /&gt;
==== Verwendung objektorientierter Mittel ====&lt;br /&gt;
Der [[Objektorientierte Programmierung|objektorientierte]] Ansatz funktioniert im Kontext statischer Typisierung nicht zufriedenstellend. Zwar lassen sich hier mit [[Schnittstelle (Objektorientierung)|Interfaces]] oder Mehrfachableitung [[Klasse (Objektorientierung)|Klassen]] um „andere“ Datentypen erweitern, sodass sich mittels Polymorphie das Verhalten der generischen Programmierung zum Teil nachbauen lässt, allerdings wird die vollständige Unabhängigkeit von unterschiedlichen Typen (bzw. Klassen) damit nicht umgesetzt, weil es sich bei diesen Techniken auch nicht strenggenommen um objektorientierte Techniken handelt.&lt;br /&gt;
&lt;br /&gt;
Definiert man in der [[Programmiersprache]] [[C++]] eine [[Klasse (Objektorientierung)|Klasse]] &amp;lt;code&amp;gt;Vergleichbares&amp;lt;/code&amp;gt; und leitet davon zum Beispiel für eine physikalische [[Simulation]] die Klassen &amp;lt;code&amp;gt;Laenge&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Masse&amp;lt;/code&amp;gt; ab (sagt also, dass sowohl Längen als auch die Masse etwas vergleichbares sind), so kann man zwar schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Vergleichbares&amp;amp; max(Vergleichbares&amp;amp; a, Vergleichbares&amp;amp; b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return b;&lt;br /&gt;
    } else {&lt;br /&gt;
        return a;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aber es gibt immer noch zwei Probleme:&lt;br /&gt;
&lt;br /&gt;
* Zunächst, dass der Ergebnistyp nur „Vergleichbares“ ist; man muss dem Compiler also beim Aufruf explizit sagen, dass das Maximum zweier Längen wieder eine Länge ist (sofern man dessen Längeneigenschaften benutzen will, was wahrscheinlich ist), vor allem aber,&lt;br /&gt;
* dass diese Funktion es erlaubt, das Maximum einer Länge und einer Masse zu „bestimmen“, obwohl diese Operation keinen physikalischen Sinn hat.&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
Generische Programmierung, beispielsweise in [[C++]] über [[Template (C++)|Templates]] realisiert, verbindet nun die Flexibilität des Makros mit der [[Typsicherheit]] und den anderen Eigenschaften der Funktion. Die generische Implementierung von max in C++ ist&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
T max(T a, T b) {&lt;br /&gt;
    if (a &amp;lt; b){&lt;br /&gt;
        return b;&lt;br /&gt;
    } else {&lt;br /&gt;
        return a;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die so definierte Funktion &amp;lt;code&amp;gt;max()&amp;lt;/code&amp;gt; kann nun für alle Typen mit [[Vergleichsoperator]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass man nicht explizit bei der Definition sagen muss, dass ein Typ vergleichbar ist (zum Beispiel durch Ableiten von einer entsprechenden Klasse), sondern man muss nur sicherstellen, dass er die nötigen Eigenschaften hat (in diesem Fall einen operator &amp;lt; mit korrekter [[Semantik]]). Auf diese Weise können auch Typen mit der Funktion verwendet werden, die in Unkenntnis der Funktion entworfen wurden (beispielsweise die eingebauten Typen der Programmiersprache).&lt;br /&gt;
&lt;br /&gt;
Ein Algorithmus sollte dabei stets möglichst wenig vom Typ fordern. So arbeiten die Algorithmen der [[Standard Template Library|STL]] nicht direkt auf den Containern, sondern mit [[Iterator]]en. Auf diese Weise werden sie weitgehend unabhängig von den genauen Eigenschaften des speziellen Containers und können teilweise sogar direkt auf Ein- und Ausgabeströmen arbeiten.&lt;br /&gt;
&lt;br /&gt;
=== C# ===&lt;br /&gt;
&lt;br /&gt;
==== Generische Programmierung ====&lt;br /&gt;
Generische Programmierung in der [[Programmiersprache]] [[C-Sharp|C#]] ähnelt den Templates in [[C++]]. Beispielsweise verwenden Klassen wie &amp;#039;&amp;#039;HashSet&amp;#039;&amp;#039;, &amp;#039;&amp;#039;List&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Dictionary&amp;#039;&amp;#039; usw. [[Generischer Typ|generische Typen]] sehr gut. In C# werden spitze Klammern verwendet, um die Parametertypen in der generischen Klassendeklaration anzugeben. Im folgenden Beispiel wird ein [[Objekt (Programmierung)|Objekt]] einer generischen [[Klasse (Objektorientierung)|Klasse]] mit zwei Typparametern erstellt.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
// Deklariert eine Klasse mit zwei Typparametern T und U&lt;br /&gt;
class Test&amp;lt;T, U&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    T object1; // Deklariert ein Objekt vom Typ T&lt;br /&gt;
    U object2; // Deklariert ein Objekt vom Typ U&lt;br /&gt;
&lt;br /&gt;
    // Konstruktor der Klasse, der die zwei Objekte initialisiert&lt;br /&gt;
    public Test(T object1, U object2)&lt;br /&gt;
    {&lt;br /&gt;
        this.object1 = object1;&lt;br /&gt;
        this.object2 = object2;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Methode, die die zwei Objekte auf der Konsole ausgibt&lt;br /&gt;
    public void Write()&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(object1);&lt;br /&gt;
        Console.WriteLine(object2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Hauptklasse, die die Hauptmethode enthält&lt;br /&gt;
class TestClass&lt;br /&gt;
{&lt;br /&gt;
	// Hauptmethode die das Programm ausführt&lt;br /&gt;
    public static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
        Test&amp;lt;string, DateTime&amp;gt; testObject = new Test&amp;lt;string, DateTime&amp;gt;(&amp;quot;Willkommen bei Wikipedia!&amp;quot;, DateTime.Now); // Aufruf des Konstruktors&lt;br /&gt;
        testObject.Write(); // Aufruf der Methode, Ausgabe auf der Konsole&lt;br /&gt;
&lt;br /&gt;
        Console.ReadLine();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Generische Methoden ====&lt;br /&gt;
Eine [[Methode (Programmierung)|Methode]], die mit den Typparametern für ihren Rückgabetyp oder ihren Rückgabeparameter deklariert wird, wird als &amp;#039;&amp;#039;generische Methode&amp;#039;&amp;#039; bezeichnet. Im folgenden Beispiel wird ein [[Objekt (Programmierung)|Objekt]] einer generischen [[Klasse (Objektorientierung)|Klasse]] mit einer generische Methoden erstellt.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
// Deklariert eine Klasse mit einem Typparameter T&lt;br /&gt;
class Test&amp;lt;T&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	private List&amp;lt;T&amp;gt; list = new List&amp;lt;T&amp;gt;(); // Deklariert eine Liste mit dem Typparameter T&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode fügt am angegebenen Index ein Element in die Liste ein&lt;br /&gt;
	public void Insert(int index, T item)&lt;br /&gt;
	{&lt;br /&gt;
		list.Insert(index, item);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese generische Methode gib das Element am angegebenen Index zurück&lt;br /&gt;
	public T Get(int index)&lt;br /&gt;
	{&lt;br /&gt;
		if (index &amp;gt;= 0 &amp;amp;&amp;amp; index &amp;lt; list.Count)&lt;br /&gt;
		{&lt;br /&gt;
			return list[index];&lt;br /&gt;
		}&lt;br /&gt;
		return default(T); // Wenn der Index nicht in der Liste ist, wird der Standardwert vom Typ zurückgegeben&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode gibt die Liste Zeile für Zeile zurück&lt;br /&gt;
	public override string ToString()&lt;br /&gt;
	{&lt;br /&gt;
		string text = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (int i = 0; i &amp;lt; list.Count; i++) // for-Schleife, die die Elemente durchläuft&lt;br /&gt;
		{&lt;br /&gt;
			text += list[i] + &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Hauptklasse, die die Hauptmethode enthält&lt;br /&gt;
class TestClass&lt;br /&gt;
{&lt;br /&gt;
	// Hauptmethode die das Programm ausführt&lt;br /&gt;
	public static void Main(string[] args)&lt;br /&gt;
	{&lt;br /&gt;
		Test&amp;lt;string&amp;gt; testObject = new Test&amp;lt;string&amp;gt;(); // Aufruf des Standard-Konstruktors mit dem Typparameter string&lt;br /&gt;
		// Fügt drei Elemente in die Liste ein&lt;br /&gt;
		testObject.Insert(0, &amp;quot;Werde Mitglied bei Wikipedia!&amp;quot;);&lt;br /&gt;
		testObject.Insert(1, &amp;quot;Willkommen bei Wikipedia!&amp;quot;);&lt;br /&gt;
		testObject.Insert(2, &amp;quot;Wie gefällt dir Wikipedia?&amp;quot;);&lt;br /&gt;
		Console.WriteLine(testObject.ToString()); // Aufruf der Methode, Ausgabe aller drei Elemente auf der Konsole&lt;br /&gt;
		Console.WriteLine(testObject.Get(1)); // Aufruf der Methode, Ausgabe des zweiten Elements auf der Konsole&lt;br /&gt;
		&lt;br /&gt;
		Console.ReadLine();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generische Programmierung in verschiedenen Programmiersprachen ==&lt;br /&gt;
* Wie bereits erwähnt, wird die generische Programmierung in C++ durch Templates unterstützt.&lt;br /&gt;
* In [[Ada (Programmiersprache)|Ada]] gab es generische Typen vor der Einführung von Templates in C++. C++ Templates sind von Ada beeinflusst, unterscheiden sich aber in vielen Punkten.&amp;lt;ref name=&amp;quot;Stroustrup94Design&amp;quot;&amp;gt;Bjarne Stroustrup (1994):The Design and Evolution of C++. Kapitel 15 Templates. Addison-Wesley, Reading, Massachusetts, ISBN 978-0-201-54330-8.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* In [[ABAP]] gibt es ebenfalls generische Datentypen.&lt;br /&gt;
* In [[Java (Programmiersprache)|Java]] kommen generische Typen ab der Version 1.5 vor.&lt;br /&gt;
* In [[TypeScript]] und den .NET-Sprachen [[C-Sharp|C#]] und [[Visual Basic .NET|VB .NET]] (ab .NET 2.0) gibt es die [[Generischer Typ|generischen Typen]] (&amp;#039;&amp;#039;generics&amp;#039;&amp;#039;).&lt;br /&gt;
* In der Programmiersprache [[Eiffel (Programmiersprache)|Eiffel]] existieren generische Klassen.&lt;br /&gt;
* Die funktionale Programmiersprache [[ML (Programmiersprache)|ML]] (und Abkömmlinge wie [[Objective CAML|OCaml]]) sowie [[Haskell (Programmiersprache)|Haskell]] erlauben generische Programmierung. Typ-Polymorphie ist dort konzeptuelle Grundlage. Es lassen sich sogar Module generieren. Generische Module („parametric modules“) werden hier als Funktor bezeichnet. Man kann Funktoren Module als Parameter übergeben und erhält ein neues Modul als Ergebnis.&lt;br /&gt;
* In Programmiersprachen wie [[Python (Programmiersprache)|Python]], welche [[Datentyp]]en dynamisch verwalten und außerdem Operatoren unterstützen, kann praktisch jede Methode im Sinne der generischen Programmierung verwendet werden.&lt;br /&gt;
* Schließlich kann man auch die [[Makro]]s in [[C (Programmiersprache)|C]] zur generischen Programmierung benutzen, wenngleich sie ursprünglich nicht zu diesem Zweck eingeführt wurden.&lt;br /&gt;
&lt;br /&gt;
== Softwaretechnik ==&lt;br /&gt;
Ein generisches [[Modellierung|Modell]] ist an spezifische Gegebenheiten einer konkreten Situation anpassbar; z.&amp;amp;nbsp;B. ein generisches [[Vorgehensmodell]] wie [[Wasserfallmodell|Wasserfall-]] oder [[Spiralmodell]] an ein konkretes [[Projekt]]. Dieser Vorgang wird im Bereich des [[Software-Engineering]] auch [[Tailoring]] genannt.&lt;br /&gt;
&lt;br /&gt;
Ändert sich das generische Modell, kann man dessen Ausprägungen leicht anpassen, wenn der Weg vom Modell zur Ausprägung detailliert beschrieben ist und man nur die geänderten Elemente verfolgen muss. Bei nicht-generischen Modellen spricht man in diesem Zusammenhang auch von [[Überanpassung]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Generische Programmierung in Java]]&lt;br /&gt;
* [[Programmierparadigma]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* R. Backhouse, P. Hoogendijk: &amp;#039;&amp;#039;Chapter 3. Generic properties of datatypes.&amp;#039;&amp;#039; In: Roland C. Backhouse (Hrsg.): &amp;#039;&amp;#039;Generic programming: advanced lectures.&amp;#039;&amp;#039; (Lecture Notes in Computer Science; 2793: Tutorial) Springer, Berlin 2003, ISBN 3-540-20194-7, S. 97–132.&lt;br /&gt;
* Stephanie Weirich, Chris Casinghino: &amp;#039;&amp;#039;Generic programming with dependent types.&amp;#039;&amp;#039; In: Jeremy Gibbons (Hrsg.): &amp;#039;&amp;#039;Generic and indexed programming: international spring school, SSGIP 2010, Oxford, UK, March 22 - 26, 2010; revised lectures.&amp;#039;&amp;#039; (Lecture Notes in Computer Science; 7470: Tutorial) Springer, Berlin 2012, ISBN 978-3-642-32201-3, S. 217–258.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.boost.org/community/generic_programming.html Generic Programming Techniques]&lt;br /&gt;
* [https://www.geeksforgeeks.org/generics-in-c/ Generics in C++]&lt;br /&gt;
* [https://www.geeksforgeeks.org/generics-in-java/ Generics in Java]&lt;br /&gt;
* [https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/types/generics Generic classes and methods]&lt;br /&gt;
* [https://www.tutorialsteacher.com/csharp/csharp-generics C# Generics]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierparadigma]]&lt;br /&gt;
[[Kategorie:C++]]&lt;/div&gt;</summary>
		<author><name>imported&gt;RolandIllig</name></author>
	</entry>
</feed>