Diciamo che hai un televisore. Sulla parte anteriore di esso , ci sono un interruttore "on / off", "channel up" e "channel down", "volume su" e "volume giù", e alcuni altri pulsanti. Questi pulsanti consentono all'utente di gestire il televisore.
All'interno del televisore ci sono un sacco di altri pulsanti per impostare le complesse impostazioni del televisore. Queste impostazioni e i pulsanti per gestire tali impostazioni non dovrebbero riguardare l'utente, sono per il tecnico televisivo per assicurarsi che il televisore funzioni come dovrebbe .
Questa distinzione tra i pulsanti per i pulsanti e per il tecnico è la distinzione principale tra private
metodi / variabili e public
metodi / variabili.
L'unico motivo per cui abbiamo un televisore è che l'utente lo usi e l'unico modo in cui l'utente può usarlo è attraverso i pulsanti sulla parte anteriore di esso. Allo stesso modo - l'unica ragione per cui abbiamo una classe è per le altre classi che lo usano, e l'unico modo in cui le altre classi possono usarlo è attraverso i metodi e le variabili che sono a loro disposizione, il public
ones .
L'unica ragione per cui abbiamo i pulsanti per il tecnico all'interno del televisore è aiutare i pulsanti sul lato anteriore a funzionare correttamente. Allo stesso modo - l'unico motivo per cui abbiamo private
metodi e variabili è di aiutare il public
a funzionare correttamente .
Abbiamo un nome per i metodi e le variabili public
di una classe. Lo chiamiamo "API". Nell'analogia televisiva, l'API è la raccolta di impostazioni e pulsanti disponibili per l'utente. Un'API è tutti i componenti di classe disponibili per altre classi.
Ora, diciamo che hai un'applicazione sul tuo smartphone che accende e spegne tutti i dispositivi elettrici di casa tua. L'applicazione può accendere e spegnere solo i dispositivi con un interruttore "On / Off". Dispositivi come un forno a microonde, non possono essere accesi e spenti dall'applicazione perché devono essere scollegati manualmente dall'alimentazione. Quindi l'applicazione deve assicurarsi che i dispositivi abbiano un interruttore "On / Off". In altre parole, dobbiamo assicurarci che tutti i dispositivi che vogliamo attivare o disattivare dispongano di un'API.
Questo è l'interfaccia.
Un'interfaccia è un modo per assicurarsi che diverse classi abbiano un'API comune.
Quindi scriviamo un'interfaccia C # attuale:
interface IHaveOnOffSwitch
{
void TurnOn();
void TurnOff();
}
Potremmo avere tre classi: TV
, Radio
e Microwave
. TV
e Radio
hanno uno switch "On / Off", quindi implementano l'interfaccia:
class TV : IHaveOnOffSwitch
{
private TvType type; // a random private variable
void TurnOn()
{
// logic for turnning on
}
void TurnOff()
{
// logic for turning off
}
}
class Radio : IHaveOnOffSwitch
{
private RadioType type; // a random private variable
void TurnOn()
{
// logic for turnning on
}
void TurnOff()
{
// logic for turning off
}
}
class Microwave
{
}
E ora i metodi dell'applicazione smartphone potrebbero essere scritti in questo modo:
void TurnDeviceOn(IHaveOnOffSwitch device)
{
device.TurnOn();
}
void TurnDeviceOff(IHaveOnOffSwitch device)
{
device.TurnOff();
}
Il motivo per cui l'applicazione utilizza l'interfaccia è sapere che i dispositivi hanno questa API, non importa quali siano le variabili private del dispositivo (come il tipo di televisione o il tipo di radio).
Ecco perché un'interfaccia non può avere metodi e variabili privati. Si tratta di ciò che la classe consente alle altre classi di fare con esso, e non di come la classe si occupi di esso internamente.