WikiDer > Vorlage (Software)
EIN Vorlage oder ein generisch (Typ) ist ein Vorlage für ein Stück Code. Mit Hilfe von Templates ist es möglich, einen Quellcode zu generieren, der für weitere Objekttypen verwendet werden kann. Vorlagen sind in der Programmiersprache verfügbar C , aber seit einiger Zeit auch in anderen Sprachen, wie zum Beispiel Java und C#. Manchmal werden Vorlagen auch als „Generika“ bezeichnet.
Vorlagen können mit verwendet werden Funktionen und mit Klassen. Viele Sprachen verwenden sie mit Containerklassen, die durch die Verwendung von Vorlagen "typsicher" werden.
Beispiel für eine generische Funktion
Ein Beispiel ist die Bestimmung des kleineren von zwei Objekten. Statt separater Funktionen für int, schweben und doppelt, aber auch für std::string, oder anderen selbstgeschriebenen Objekten, kann eine Vorlagenfunktion verwendet werden:
VorlageT kleinste(T a, T b) { if (a < b) return a; sonst Rückgabe b; }
Diese Funktion kann dann für alle Klassen verwendet werden, die '<' unterstützen. Dies ist ein wichtiger Unterschied zur 'traditionellen' Programmierung in OO-Sprachen: Normalerweise müssen die Parameter einer Funktion bestimmt werden (in einer Schnittstelle oder einer Typspezifikation). Beispielsweise kann eine Funktion angeben, dass sie nur Objekte haben möchte, die eine Schnittstelle X implementieren, die eine Methode Y enthält. Bei Templates wird dies nicht im Vorfeld erzwungen, sondern erst bei der tatsächlichen Verwendung geprüft, ob ein bestimmter Typ in ein Template 'passt'.
Beispielklasse mit Vorlage
Hier ist ein Beispiel für eine Liste, zu der Elemente hinzugefügt werden können und auf deren Elemente mit dem Indexoperator zugegriffen werden kann. Tatsächlich ist dies eine abgespeckte Container.
templateclass List{public: List():m_Last(0),m_List(NULL) {} virtual ~List() {delete[] m_List;} void Add(const T &item) { T* NewList = new T[m_Letzte 1]; for (int i = 0; i < m_Last; i) { NewList[i] = m_List[i]; } NewList[m_Last] = Element; lösche [] m_Liste; m_Liste = NeueListe; m_Letzte ; } int Dimensions() { return m_Last;} operator [](int index) { return m_List[index]};protected: T* m_List; int m_Last;};
Template-Metaprogrammierung
Templates können auch verwendet werden, um 'Kompilierungszeit' (dh nicht wenn das Programm läuft, sondern wenn es kompiliert wird), Berechnungen und andere 'Tricks' durchzuführen. Das bekannteste Beispiel für Template-Metaprogrammierung in C ist:
templateclass Factorial { public: enum { value = N * Factorial ::value };};class Factorial<1> { public: enum { value = 1 };};int factorialOf20 = Factorial <20>::Wert;
Im obigen Beispiel ist factorialOf20 als der Wert von Factorial<20>::value definiert, der wiederum als Factorial<19>::value * 20 definiert ist. Dies geht weiter bis Factorial<1>, der standardmäßig als . definiert ist 1. Dieses Beispiel verwendet Rekursion, aber es wurden Techniken entwickelt, um auch Programmierkonzepte wie If/Else und For in der Template-Metaprogrammierung verwenden zu können.
Generische Typen in C#
Generische Typen können in C# 2.0 verwendet werden, um: typsicher mit Sammlungen zu arbeiten. Im folgenden Beispiel ist die nicht generische Sammlung Anordnungsliste Jede Art von Objekt kann hinzugefügt werden, außer der generischen Sammlung Liste nur Objekte vom Typ A. Die generische List-Auflistung ist daher typsicher.
Klasse A { } Klasse B { } privat void TestLists() { ArrayList list = new ArrayList(); list.Add(neues A()); list.Add(neues B()); Liste ListeA = neue Liste(); listA.Add(neues A()); //listA.Add (neues B()); kompiliert nicht! }