Interfacce (Guida per programmatori C#)
Aggiornamento: novembre 2007
Per la definizione delle interfacce viene utilizzata la parola chiave interface, come illustrato nell'esempio seguente:
interface IEquatable<T>
{
bool Equals(T obj);
}
Le interfacce descrivono un gruppo di funzionalità correlate che possono appartenere a qualsiasi classe o struttura. Possono essere costituite da metodi, proprietà, eventi, indicizzatori o qualsiasi combinazione di questi quattro tipi di membro. Un'interfaccia non può contenere campi. I membri delle interfacce sono automaticamente pubblici.
Dire che una classe o una struttura eredita un'interfaccia, significa che la classe o la struttura forniscono un'implementazione per tutti i membri definiti dall'interfaccia. L'interfaccia stessa non fornisce funzionalità ereditabili da una classe o una struttura, nel modo in cui le funzionalità della classe base possono essere ereditate. Tuttavia, se una classe base implementa un'interfaccia, la classe derivata eredita tale implementazione.
Le classi e le strutture possono ereditare dalle interfacce, così come le classi possono ereditare una classe base o una struttura, con due eccezioni:
Una classe o una struttura può ereditare da più interfacce.
Quando una classe o una struttura eredita un'interfaccia, eredita solo i nomi e le firme dei metodi perché l'interfaccia stessa non contiene implementazioni. Esempio:
public class Car : IEquatable<Car> { public string Make {get; set;} public string Model { get; set; } public string Year { get; set; } // Implementation of IEquatable<T> interface public bool Equals(Car car) { if (this.Make == car.Make && this.Model == car.Model && this.Year == car.Year) { return true; } else return false; } }
Per implementare un membro di un'interfaccia, è necessario che il membro corrispondente nella classe sia pubblico, non statico e disponga dello stesso nome e della stessa firma del membro dell'interfaccia. Le proprietà e gli indicizzatori di una classe possono definire funzioni di accesso aggiuntive per una proprietà o per un indicizzatore definito in un'interfaccia. Un'interfaccia può ad esempio dichiarare una proprietà con una funzione di accesso get, ma la classe che implementa l'interfaccia può dichiarare la stessa proprietà sia con una funzione di accesso get che con una funzione di accesso set. Se tuttavia la proprietà o l'indicizzatore utilizza l'implementazione esplicita, le funzioni di accesso devono corrispondere.
Le interfacce e i relativi membri sono astratti. Le interfacce non prevedono un'implementazione predefinita. Per ulteriori informazioni, vedere Classi e membri delle classi astratte e sealed.
L'interfaccia IEquatable<T> annuncia all'utente dell'oggetto che quest'ultimo può determinare la propria uguaglianza con altri oggetti dello stesso tipo. L'utente dell'interfaccia non deve necessariamente conoscerne la modalità di implementazione.
Le interfacce possono ereditare altre interfacce. Una classe può ereditare un'interfaccia più volte, tramite le classi basi o le interfacce che eredita. In questo caso la classe può implementare l'interfaccia solo una volta, se viene dichiarata come parte della nuova classe. Se l'interfaccia ereditata non viene dichiarata come parte della nuova classe, la relativa implementazione viene fornita dalla classe base che l'ha dichiarata. Una classe base può implementare i membri dell'interfaccia utilizzando membri virtuali. In questo caso la classe che eredita l'interfaccia può modificarne il comportamento eseguendo l'override dei membri virtuali. Per ulteriori informazioni sui membri virtuali, vedere Polimorfismo.
Cenni preliminari sulle interfacce
Di seguito sono riportate le caratteristiche principali di un'interfaccia:
Un'interfaccia è analoga a una classe base astratta: qualsiasi tipo non astratto che eredita l'interfaccia deve implementarne tutti i relativi membri.
Non è possibile creare direttamente istanze di un'interfaccia.
Le interfacce possono contenere eventi, indicizzatori, metodi e proprietà.
Le interfacce non contengono implementazioni di metodi.
Le classi e le strutture possono ereditare da più interfacce.
Un'interfaccia può a sua volta ereditare da più interfacce.
In questa sezione
Implementazione esplicita di un membro di interfaccia (Guida per programmatori C#)
Viene spiegato come creare un membro della classe specifico per un'interfaccia.Procedura: implementare in modo esplicito i membri di interfaccia (Guida per programmatori C#)
Viene fornito un esempio di come implementare in modo esplicito membri di interfacce.Procedura: implementare i membri di interfaccia in modo esplicito con l'ereditarietà (Guida per programmatori C#)
Viene fornito un esempio di come implementare in modo esplicito membri di interfacce con l'ereditarietà.
Sezioni correlate
Proprietà delle interfacce (Guida per programmatori C#)
Viene spiegato come dichiarare le proprietà su un'interfaccia.Indicizzatori nelle interfacce (Guida per programmatori C#)
Viene spiegato come dichiarare gli indicizzatori su un'interfaccia.Procedura: implementare gli eventi di interfaccia (Guida per programmatori C#)
Viene illustrato come un'interfaccia può dichiarare un evento.Classi e strutture (Guida per programmatori C#)
Viene descritto come C# utilizza oggetti, classi e strutture.Ereditarietà (Guida per programmatori C#)
Viene spiegato come C# implementa l'ereditarietà.Metodi (Guida per programmatori C#)
Vengono spiegati i concetti dei metodi denominati nel modello di programmazione C#.Polimorfismo (Guida per programmatori C#)
Viene descritto come le classi possono essere utilizzate come tipi in C#.Classi e membri delle classi astratte e sealed (Guida per programmatori C#)
Viene descritto come le parole chiave abstract e sealed hanno effetto sull'ereditarietà.Proprietà (Guida per programmatori C#)
Viene spiegato il concetto di proprietà in C#.Eventi (Guida per programmatori C#)
Viene spiegato il concetto di evento in C#.Indicizzatori (Guida per programmatori C#)
Viene spiegato il concetto di indicizzatore in C#.