Le interfacce definiscono in modo efficace un contratto di presentazione e forniscono un mezzo per offrire la compatibilità tra le classi a un livello molto astratto. Quando si utilizza un'interfaccia, si sta effettivamente dicendo "questa classe è definita in un modo, ma può essere utilizzata in un altro modo per essere compatibile con un'altra classe" .
Fondamentalmente stai definendo un caso d'uso. Di solito non stai chiedendo un oggetto per le sue proprietà tramite un'interfaccia se hai accesso all'oggetto stesso. Normalmente chiederai comunque che l'oggetto si comporti in un modo che potrebbe essere coerente con il comportamento di altri tipi di classe in un sistema, in modo che ognuno possa essere chiamato e si prevede che si comporti in modo simile e coerente. Questo è Polymorphism 101.
Ora, mi contraddirei un po '. Ho detto prima che normalmente non chiedi alla classe le sue proprietà tramite un'interfaccia. L'intenzione con le interfacce come definite è sicuramente quella di comportarsi in questo modo. Tuttavia puoi richiedere che una classe ti fornisca le sue proprietà tramite un'interfaccia, ma tu usi il metodo invece della sintassi delle proprietà. In questo caso, si richiede alla classe (tramite un'interfaccia) di comportarsi in un modo che consenta di recuperare i valori tramite un metodo getter. È il classico comportamento richiesta / risposta, che è totalmente in linea con la natura comportamentale fondamentale delle interfacce, pur non escludendo la capacità di trattare una classe come se fosse semplicemente una struttura dati più semplice o un tipo compatibile con altre classi tramite un'interfaccia comune astrazione.
Anche il comportamento Getter / Setter è in linea con l'incapsulamento di tutte le variabili interne. Linguaggi come Delphi e ora C # con le sue proprietà automatiche tendono a sfocare le linee e fanno sembrare le proprietà come se fossero semplici variabili, ma la realtà è che per ogni proprietà c'è un metodo getter e setter sotto il cappuccio per ogni proprietà . E se no, dovrebbe esserci per preservare l'incapsulamento.
Da questa prospettiva, le interfacce non sono limitate al solo comportamento. Essi sono migliorati in modo efficace e, a loro volta, migliorano le classi che li implementano.