OOP é uma abordagem balanceada para escrever software. Dados e comportamento são empacotados juntos. Este encapsulamento cria tipos de dados definidos pelo usuário, estendendo os tipos de dados da linguagem e interagindo com eles. Extensibilidade de tipos é uma oportunidade de adicionar à linguagem tipos de dados definidos pelo usuário, que são também fáceis de usar, tanto quanto os tipos básicos.

Um tipo de dado abstrato (ADT), por exemplo, uma string, é uma descrição do ideal, bem conhecido tipo de comportamento.

O usuário de string sabe que as operações de string, tais como concatenação ou impressão, têm um certo comportamento. Operações de concatenação e impressão são chamados métodos.

Uma certa implementação de ADT pode ter algumas restrições, por exemplo, strings podem ser limitados no comprimento. Estas limitações afetam o comportamento aberto a todos. Ao mesmo tempo, detalhes da implementação privada ou interna não afetam diretamente a jeito como o usuário vê o objeto. Por exemplo, a string é freqüentemente implementado como um array, enquanto o endereço de base interno deste array e seu nome não são essenciais para o usuário.

Encapsulamento é a habilidade de ocultar os detalhes de implementação quando a interface aberta para o tipo definido pelo usuário é fornecida. Em MQL5, assim como em in C++, definições de classe e estrutura (class e struct) são usadas para as provisões de encapsulamento em combinação com as palavras-chave de acesso private, protected e public.

A palavra-chave public mostra que o acesso aos membros que ficam depois dela, é aberto sem restrições. Sem esta palavra-chave, membros de classe ficariam bloqueados por default. Membros privados são acessíveis somente por funções membro de sua própria classe.

Funções de classe protegidas são disponíveis para funções de classe não apenas em sua classe, mas também em suas classes herdeiras. Funções de classe publicas são disponíveis para qualquer função dentro do escopo da declaração da classe. A proteção torna possível ocultar parte da implementação da classe, evitando assim mudanças inesperadas na estrutura dos dados. Restrição de acesso ou ocultamento de dados é uma característica da programação orientada a objetos.

Geralmente, funções de classe são protegidas e declaradas com o modificador protected, a leitura e a escrita de valores são realizadas por meio do uso de métodos especiais chamados set e get que são definidos por meio do modificador de acesso public.



Exemplo:

class CPerson
{
protected:
string first_name; // nome
public:
void SetName(string n){m_name=n;}// atribui o nome
string GetName(){return (m_name);} // retorna o nome
};



Esta abordagem oferece várias vantagens. Primeiro, por meio do nome da função nós podemos entender o que ela faz - define (sets) ou obtém (gets) o valor de um membro de classe. Segundo, talvez no futuro precisemos modificar o tipo da variável m_name na classe CPerson ou em qualquer de suas classes derivadas.

Neste caso, necessitaríamos apenas alterar a implementação das funções SetName() e GetName(), enquanto que objetos da classe CPerson estariam disponíveis para uso em um programa sem nenhuma alteração de código, porque o usuário nem ao menos saberia que o tipo de dado do m_name foi alterado.

Exemplo:

struct Name
{
string first_name; // nome
string last_name; // último nome
};

class CPerson
{
protected:
Name m_name; // nome
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);
}