Condividi tramite


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

Sezioni correlate

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Ereditarietà (Guida per programmatori C#)