- Inkapsulation und Erweiterungsfaehigkeit der Typen
- Vererbung
- Polymorphismus
- Überladen
- Virtuelle Funktionen
- Statische Klassenmitglieder
- Funktionstemplates
- Klassentemplates
- Abstrakte Klassen
Funktionstemplates
Überladene Funktionen werden häufig verwendet, um ähnliche Operationen auf verschiedene Datentypen durchzuführen. Ein einfaches Beispiel für eine solche Funktion im MQL5 ist ArraySize(), die die Größe des Arrays jeder Art zurück gibt. In der Tat ist dieses System Funktion überladen, und die ganze Umsetzung dieses Überladen wird von der MQL5 Software-Entwickler versteckt:
int ArraySize(
|
MQL5 Compiler MQL5 ersetzt eine rechte Umsetzung für jeden Aufruf dieser Funktion. Zum Beispiel für Arrays von Typ integer:
int ArraySize(
|
Und für einem Array vom Typ MqlRates für Arbeit mit Preise im Format von historischen Daten kann Funktion ArraySize() wie folgt dargestellt werden:
int ArraySize(
|
Somit ist es sehr praktisch, die gleiche Funktion für verschiedenen Typen zu nutzen, aber Sie müssen Vorarbeiten ausführen - nämlich Überladen der Funktion für alle Datentypen, mit denen sie arbeitet.
Es gibt eine bequeme Lösung - wenn für jeden Datentyp identische Operationen durchgeführt werden sollte, gibt es eine kompakte und praktische Lösung, Funktionsschablonen zu verwenden. In diesem Fall muss der Programmierer nur eine Beschreibung der Funktionsschablone zu schreiben. Für diese Beschreibung der Schablone, müssen Sie nicht einen spezifischen Datentyp, mit dem die Funktion arbeiten soll, als Parameter eingeben, sondern einen formalen Parameter. Basierend auf der Typen der verwendeten Argumente beim Aufruf der Funktion, wird der Compiler automatisch verschiedene Funktionen für die geeignete Behandlung für jeden Typ generieren.
Die Definition einer Funktionsschablone beginnt mit dem Schlüsselwort template wonach in spitzen Klammern ist eine Liste der formalen Parameter. Jeder formale Parameter wird durch das Schlüsselwort typename vorangestellt. Die formalen Parameter-Typen sind eingebaute Typen oder benutzerdefinierte Typen. Sie werden verwendet:
- um die Type der Argumente der Funktion einzugeben
- um den Typ des Rückgabewerts der Funktion einzugeben
- um Variablen innerhalb des Körpers der Beschreibung der Funktion zu erklären
Die Anzahl der Parameter in einer Schablone kann nicht mehr als acht sein. Jeder formale Parameter in der Schablone-Definition sollte mindestens einmal in der Funktion Parameter-Liste erscheinen. Jeder Name vom formalen Parameter muss eindeutig sein.
Hier ist ein Beispiel für ein Funktionsschablone für die Suche nach den maximalen Wert in einem Array von beliebigen numerischen Typs (integer und reelle Zahlen):
template<typename T> |
Dieses Beispiel beschreibt eine Funktion, die den größten Wert in dem übergebenen Array findet, um es als Ergebnis zurück zu geben. Daran erinnern, dass die eingebaute MQL5 Funktion ArrayMaximum() gibt nur der Index des gefundenen Maximalwert zurück, mit dem der Benutzer kann in der Zukunft den Wert selbst bekommen. Zum Beispiel:
//--- Erstellen wir ein Array |
So brauchen wir zwei Schritte, um den maximalen Wert in dem Array zu erhalten. Mit Hilfe der Funktionsschablone ArrayMax() kann man das Ergebnis vom gewünschten Typ erhalten, wenn man ein Array des entsprechenden Typs in sie übergibt. Das heißt, anstelle der zwei letzten Zeilen
//--- Finden wir die Position der maximalen Element im Array |
Jetzt können wir nur eine einzige Zeile, die ein Ergebnis des gleichen Typs wie der übergebenen Array zurückgibt, benutzen:
//--- Finden wir den maximalen Wert |
Der Typ des Ergebnisses, der durch ArrayMax() zurückgegeben wird, wird automatisch mit dem Typ des Arrays gleich sein.
Um mit verschiedenen Typen von Daten zu arbeiten, müssen Sie das Schlüsselwort typename verwenden, um den Typ des Arguments als Zeichen zu erhalten. Wir zeigen dies am Beispiel einer Funktion, die einen Datentyp als String zurückgibt:
#include <Trade\Trade.mqh> |
Funktionsschablonen können auch für Klassenmethode verwendet werden, zum Beispiel:
class CFile |
Funktionsschablonen können nicht mit den Schlüsselwörtern export, virtual und #import deklariert werden.
Überladen von Funktionstemplates
In einigen Fällen müssen Funktionen überladen werden. Wir haben zum Beispiel ein Funktionstemplate, das den Wert des zweiten Parameters in den ersten Parameter mithilfe der expliziten Typenumwandlungschreibt. In der MQL5-Programmiersprache ist es verboten, den string Typ in den bool Typ umzuwandeln, wir können das selbst tun - dafür erstellen wir die Überladung des Funktiostempaltes. Zum Beispiel:
//+------------------------------------------------------------------+
|
Wenn der Code ausgeführt wird, können wir sehen, dass für das Paar int+string das Funktionstemplate Assign() verwendet wurde und bei dem zweiten Aufruf für das Paar bool+string die überladene Version verwendet.
string Assign<int,string>(int&,string)
|
Siehe auch