As variáveis de membro são a implementação da classe, não a interface. Você pode alterar a implementação; portanto, outras classes não devem ter permissão para se referir a essa implementação diretamente.
Considere uma classe com os seguintes métodos - sintaxe C ++, mas isso não é importante ...
class example
{
public:
virtual void Set_Mode (int p_mode);
virtual int Mode () const;
};
Parece bastante óbvio que haverá uma variável membro chamada mode
ou m_mode
similar que armazena diretamente esse valor de modo, fazendo o que uma "propriedade" faria em alguns idiomas - mas isso não é necessariamente verdade. Há muitas maneiras diferentes de lidar com isso. Por exemplo, o método Set_Mode pode ...
- Identifique o modo usando uma instrução switch.
- Instancie uma subclasse de alguma classe interna, dependendo do valor desse modo.
- Armazene um ponteiro para essa instância como uma variável de membro.
Feito isso, muitos outros métodos da classe de exemplo podem chamar métodos apropriados dessa classe interna por meio do ponteiro, obtendo um comportamento específico do modo sem precisar verificar qual é o modo atual.
O ponto aqui é menos que há mais de uma maneira possível de implementar esse tipo de coisa e muito mais que em algum momento você possa mudar de idéia. Talvez você tenha começado com uma variável simples, mas todas as instruções do switch para identificar o modo em todos os métodos estão sofrendo. Ou talvez você tenha começado com a coisa de apontador de instância, mas isso acabou sendo muito pesado para a sua situação.
Acontece que coisas assim podem acontecer para qualquer dado de membro. Pode ser necessário alterar as unidades nas quais um valor é armazenado de milhas para quilômetros, ou você pode achar que o seu enumerar de identificação exclusiva do caso não pode mais identificar exclusivamente todos os casos sem considerar algumas informações extras ou o que for.
Isso também pode acontecer para métodos - alguns são puramente para uso interno, dependem da implementação e devem ser privados. Mas muitos métodos fazem parte da interface e não precisam ser renomeados ou o que quer que seja, apenas porque a implementação interna da classe foi substituída.
De qualquer forma, se sua implementação for exposta, outro código começará inevitavelmente a depender dela, e você ficará preso a mantê-la. Se sua implementação estiver oculta de outro código, essa situação não poderá acontecer.
O bloqueio do acesso aos detalhes da implementação é chamado de "ocultação de dados".