Le variabili membro sono l'implementazione della classe, non l'interfaccia. Potresti voler cambiare l'implementazione, quindi alle altre classi non dovrebbe essere consentito di fare riferimento direttamente a tale implementazione.
Considera una classe con i seguenti metodi: sintassi C ++, ma non è importante ...
class example
{
public:
virtual void Set_Mode (int p_mode);
virtual int Mode () const;
};
Sembra abbastanza ovvio che ci sarà una variabile membro chiamata mode
o m_mode
o simile che memorizza direttamente quel valore di modalità, facendo praticamente ciò che una "proprietà" farebbe in alcune lingue - ma non è necessariamente vero. Esistono molti modi diversi per gestire questo problema. Ad esempio, il metodo Set_Mode potrebbe ...
- Identifica la modalità utilizzando un'istruzione switch.
- Crea un'istanza di una sottoclasse di qualche classe interna, a seconda del valore della modalità.
- Archivia un puntatore a quell'istanza come variabile membro.
Fatto ciò, molti altri metodi della classe di esempio potrebbero chiamare i metodi appropriati di quella classe interna attraverso il puntatore, ottenendo un comportamento specifico della modalità senza dover controllare quale sia la modalità corrente.
Il punto qui è meno che ci sia più di un modo possibile per implementare questo tipo di cose, e molto altro ancora che a un certo momento potresti cambiare idea. Forse hai iniziato con una semplice variabile, ma tutte le istruzioni switch per identificare la modalità in ogni metodo stanno diventando un problema. O forse hai iniziato con la cosa dell'istanza-puntatore, ma si è rivelato troppo pesante per la tua situazione.
Si scopre che cose del genere possono accadere per qualsiasi dato membro. Potrebbe essere necessario modificare le unità in cui è memorizzato un valore da miglia a chilometri, oppure potresti scoprire che l'enumerazione univoca del tuo caso non può più identificare in modo univoco tutti i casi senza considerare alcune informazioni aggiuntive o altro.
Questo può succedere anche per i metodi - alcuni metodi sono puramente per uso interno, dipendono dall'implementazione e dovrebbero essere privati. Ma molti metodi fanno parte dell'interfaccia e non dovranno essere rinominati o qualsiasi altra cosa solo perché l'implementazione interna della classe è stata sostituita.
Ad ogni modo, se la tua implementazione è esposta, un altro codice inizierà inevitabilmente a dipendere da esso e sarai bloccato nel mantenere tale implementazione. Se la tua implementazione è nascosta da un altro codice, quella situazione non può accadere.
Il blocco dell'accesso ai dettagli di implementazione è chiamato "nascondimento dei dati".