MetaTrader 5 herunterladen
Nachschlagewerk MQL5Grundlagen der SpracheObjektorientiertes ProgrammierenInkapsulation und Erweiterungsfaehigkeit der Typen 

Inkapsulation und Erweiterungsfaehigkeit der Typen

OOP ist balancierter Zugang zum Schreiben von Software. Daten und Verhalten sind zusammen verpackt. Diese Inkapsulation erzeugt die vom Benutzer bestimmten Datentypen, die eigene Sprachdatentypen und mit ihnen zusammenwirkende Typen erweitern. Erweiterungsfaehigkeit der typen ist die Moeglichkeit, die vom Benutzer bestimmten Datentypen der Sprache zuzusetzen, die so einfach verwendet werden können, wie   Grundtypen.

Abstrakter Datentyp, zB. die Zeile ist die Beschreibung des idealen, allgemeinbekannten Verhaltens des Typs. Benutzer der Zeile weiss, dass Operationen, wie Konkatenanz oder Drucken bestimmtes Verhalten hat. Operationen on Konkatenanz und Drucken heissen Methoden.

Bestimmte ADT Realisierung kann Beschraenkungen haben; die Laenge von Zeilen kann ZB. begrenzt werden. Diese Beschraenkungen beeinflussen Verhalten, offen für alle. Zu gleicher Zeit beeinflussen interne oder geschlossene Realisierungsdetails das nicht, wie der Benutzer das Objekt sieht. ZB. die Zeile wird oft als Feld realisiert; dabei ist interne Grundadresse der Elemente dieses Feldes und sein Name für Benutzer nicht bedeutend sind.  

Inkapsulation ist die Faehigkeit, interne Details zu verhuellen Versorgung mit dem offenen Interface zu dem vom Benutzer bestimmten Typ. In MQL5 werden wie in C++, Definitionen der Klasse und der Struktur (class und struct) mit den Schluesselwoertern des Zuganges private (geschlossen), protected (geschuetzt) und public (offen) verwendet.

Schluesselwort public zeigt, dass Zugang zu Gliedern, die ihm folgen, ist offen ohne Begrenzungen. Ohne dieses Schluesselwort sind Klassenglieder als Standardeinstellung geschlossen. Geschlossene Glieder sind erst den Funktionen-Gliedern der eigenen Klasse.  

Geschuetzte Klassenglieder sind nicht nur für die Funktionen-Glieder der eigener Klasse, sondern auch für die Klassen-Nachfolger zugaenglich. Offene Glieder sind für jede Funktion innerhalb des Sichtbereiches der Klassenerklärung zugaenglich.  Geschlossenheit ermöglicht Teil der Klassenrealisierung zu verhuellen, und verhindert damit nicht vorausgesehene Änderungen der Datenstruktur. Zugangsbegrezung oder Datenverhuellung ist eine Eigenschaft des objektorientiertes Programmieren.

Gewoehnlich versucht man, Klassenglieder zu schuetzen und sie mit dem Modifikator protected zu erklären, Einstellung und Lesen der Werte dieser Glieder ist durch sogenannte  set- und get-Methoden durchgeführt, die vom Zugangsmodifikator , public bestimmt werden

Beispiel:

class CPerson
  {
protected:
   string            m_name;                     // Name 
public:
   void              SetName(string n){m_name=n;}// stellt Name ein 
   string            GetName(){return (m_name);} // gibt Name zurück
  };

Solcher Zugang hat eine Reihe der Vorteile. Erstens kann nach dem Namen der Funktion verstanden werden, was sie macht - ob sie den Wert des Klassenglieders einstellt oder erhaelt. Zweitens können wir in der Zukunft Typ der Variable m_name in der Klasse CPerson oder in einer seiner sekundaeren Klasse verändert werden, wenn erforderlich.

In diesem Fall ist es genug, Realisierung der Funktionen SetName() und GetName() zu verändern, die Objekte der Klasse CPerson können im Programm ohne Änderungen im Kode verwende werden, denn der Benutzer wird nicht wissen, dass sich Datentyp m_name verändert hat.

Beispiel:

struct Name
  {
   string            first_name;                 // Vorname
   string            last_name;                  // Name
  };
 
class CPerson
  {
protected:
   Name              m_name;                     // Vorname
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
 
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
 ;}
 
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
 ;}
 
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
 ;}

Sehen Sie auch

Datentypen