Interfacce (Guida per programmatori C#)

Le interfacce descrivono un gruppo di funzionalità correlate che possono appartenere a qualsiasi classe o struttura. Le interfacce vengono definite utilizzando la parola chiave interface, come illustrato nell'esempio seguente.

interface IEquatable<T>
{
    bool Equals(T obj);
}

Le interfacce son costituite da metodi, proprietà, eventi, indicizzatori o qualsiasi combinazione di questi quattro tipi di membro. Interfaccia non può contenere le costanti, i campi, gli operatori, i costruttori di istanza, i distruttori o i tipi. Non può contenere membri statici. I membri delle interfacce sono automaticamente pubblici e non possono includere nessun modificatore di accesso.

Quando una classe o una struttura implementa un'interfaccia, 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. La classe derivata implementa l'interfaccia in modo implicito.

Classi e struct possono implementare le interfacce, così come le classi possono ereditare una classe base o una struttura, con due eccezioni:

  • Una classe o uno struct può implementare più interfacce.

  • Quando una classe o una struttura implementa un'interfaccia, riceve solo i nomi e le firme dei metodi perché l'interfaccia stessa non contiene implementazioni, come illustrato nell'esempio seguente.

    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;
        }
    }
    

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.

Per implementare un membro di un'interfaccia, è necessario che il membro corrispondente della 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. Ad esempio, un'interfaccia può dichiarare una proprietà che dispone di una funzione di accesso get. La classe che implementa l'interfaccia può dichiarare la stessa proprietà sia con la funzione di accesso get che con la funzione di accesso set. Se tuttavia la proprietà o l'indicizzatore utilizza l'implementazione esplicita, le funzioni di accesso devono corrispondere. Per ulteriori informazioni sull'implementazione esplicita, vedere Proprietà dell'interfaccia (Guida per programmatori C#).

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.

Le interfacce possono ereditare altre interfacce. Una classe può ereditare un'interfaccia più volte, tramite le classi basi o le interfacce che eredita da altre interfacce. Tuttavia, la classe può implementare l'interfaccia solo una volta, e solo se l'interfaccia viene dichiarata come parte della definizione della classe come in class ClassName : InterfaceName. Se l'interfaccia viene ereditata perché è stata ereditata una classe base che implementa l'interfaccia, la relativa implementazione viene fornita dalla classe base. È inoltre possibile che una classe base implementi i membri dell'interfaccia mediante membri virtuali. In tal caso, una classe derivata può modificare il comportamento dell'interfaccia 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 implementa 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 implementare più interfacce.

  • Un'interfaccia può a sua volta ereditare da più interfacce.

Argomenti della sezione

Sezioni correlate

Capitolo del libro rappresentati

Interfaces in Learning C# 3.0: Master the Fundamentals of C# 3.0

Vedere anche

Riferimenti

Ereditarietà (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2010

Distinzione tra l'implementazione e l'ereditarietà. Chiarimento relativo a ciò che può e non può essere incluso nelle interfacce.

Commenti e suggerimenti dei clienti.