Interfacce (Guida per programmatori C#)

Un'interfaccia contenente le definizioni per un gruppo di funzionalità correlate a classe o struttura può implementare.

Tramite le interfacce, è possibile, ad esempio, includere il comportamento da diverse origini nella classe.Tale funzionalità è importante in c poiché il linguaggio non supporta l'ereditarietà multipla di classi.Inoltre, è necessario utilizzare un'interfaccia se si desidera simulare l'ereditarietà per gli struct, perché non è effettivamente ereditare da un'altra classe o struct.

Definire un'interfaccia utilizzando la parola chiave di interfaccia, come illustrato di seguito.

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

Qualsiasi classe o struttura che implementa l'interfaccia di IEquatable<T> deve contenere una definizione per un metodo di Equals che corrisponde alla firma dell'interfaccia specifica.Pertanto, è possibile contare su una classe che implementa IEquatable<T> per contenere un metodo di Equals con cui un'istanza della classe può determinare se è uguale a un'altra istanza della stessa classe.

La definizione di IEquatable<T> non fornisce un'implementazione per Equals.L'interfaccia definisce solo la firma.In tal modo, un'interfaccia in c è simile a una classe astratta in cui tutti i metodi vengono astratti.Tuttavia, una classe o una struttura può implementare più interfacce, ma la classe può ereditare una sola classe, estrarre o meno.Pertanto, tramite interfacce, è possibile includere il comportamento da diverse origini nella classe.

Per ulteriori informazioni sulle classi astratte, vedere Estrarre e classi sealed e membri di classe.

Le interfacce possono contenere metodi, proprietà, eventi, indicizzatori, o qualsiasi combinazione di tali tipi di quattro membri.Per collegamenti a esempi, vedere Sezioni correlate.Un'interfaccia non può contenere costanti, i campi, gli operatori, costruttori di istanza, i distruttori, o tipi.I membri di interfaccia vengono automaticamente pubblici e non possono includere eventuali modificatori di accesso.I membri anche non possono essere statico.

Per implementare un membro di interfaccia, il membro corrispondente della classe di implementazione deve essere pubblico, non statici e ha lo stesso nome e la stessa firma del membro di interfaccia.

Quando una classe o una struttura implementa un'interfaccia, la classe o la struttura deve fornire un'implementazione per tutti i membri che l'interfaccia definisce.L'interfaccia stessa non fornisce funzionalità della classe o uno struct possa ereditare in modalità che può ereditare le funzionalità della classe base.Tuttavia, se una classe base implementa un'interfaccia, qualsiasi classe derivata dalla classe base eredita tale implementazione.

Il seguente esempio viene illustrata l'implementazione di un'interfaccia di IEquatable<T> .La classe di implementazione, Car, deve fornire un'implementazione del metodo di Equals.

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

Le proprietà e gli indicizzatori di classe possono definire le funzioni di accesso aggiuntive per una proprietà o un indicizzatore definito in un'interfaccia.Ad esempio, un'interfaccia può dichiarare una proprietà con una funzione di accesso ottenere.La classe che implementa l'interfaccia può dichiarare la stessa proprietà sia con get che 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 Implementazione esplicita dell'interfaccia (Guida per programmatori C#)Proprietà dell'interfaccia (Guida per programmatori C#)).

Le interfacce possono implementare altre interfacce.Una classe potrebbe includere più volte un'interfaccia tra le classi di base che eredita o tramite interfacce che altre interfacce implementano.Tuttavia, la classe può fornire un'implementazione di un'interfaccia una sola volta e solo se la classe dichiara l'interfaccia come parte della definizione della classe (class ClassName : InterfaceName).Se l'interfaccia è ereditata perché è ereditato da una classe base che implementa l'interfaccia, la classe base fornisce l'implementazione di membri di interfaccia.Tuttavia, la classe derivata può reimplementare i membri di interfaccia anziché utilizzare l'implementazione ereditata.

Una classe di base può implementare anche i membri di interfaccia utilizzando i 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.

Di seguito sono riportate le caratteristiche principali di un'interfaccia:

  • Un'interfaccia è come una classe base astratta.Qualsiasi classe o struttura che implementa l'interfaccia deve implementare tutti i membri.

  • Un'interfaccia non è possibile creare un'istanza direttamente.I membri vengono implementati da qualsiasi classe o struttura che implementa l'interfaccia.

  • Le interfacce possono contenere eventi, indicizzatori, metodi e proprietà.

  • Le interfacce non contengono implementazioni di metodi.

  • Una classe o una struttura può implementare più interfacce.La classe può ereditare una classe base e anche possibile implementare una o più interfacce.

Argomenti della sezione

Sezioni correlate

Capitoli del libro rappresentati

Interfacce in Apprendimento di c 3,0: Padroneggi i principi fondamentali di c 3,0

Vedere anche

Riferimenti

Ereditarietà (Guida per programmatori C#)

Concetti

Guida per programmatori C#