Interfacce (Guida per programmatori C#)Interfaces (C# Programming Guide)

Un'interfaccia contiene le definizioni per un gruppo di funzionalità correlate che devono essere implementate da una classe non astratta o da uno struct .An interface contains definitions for a group of related functionalities that a non-abstract class or a struct must implement. Un'interfaccia può definire static metodi, che devono disporre di un'implementazione di.An interface may define static methods, which must have an implementation. A partire da C# 8,0, un'interfaccia può definire un'implementazione predefinita per i membri.Beginning with C# 8.0, an interface may define a default implementation for members. Un'interfaccia non può dichiarare i dati dell'istanza, ad esempio i campi, le proprietà implementate automaticamente o gli eventi di tipo proprietà.An interface may not declare instance data such as fields, auto-implemented properties, or property-like events.

Usando le interfacce, è possibile, ad esempio, includere il comportamento di più origini in una classe.By using interfaces, you can, for example, include behavior from multiple sources in a class. Tale funzionalità è importante in C# perché il linguaggio non supporta l'ereditarietà multipla delle classi.That capability is important in C# because the language doesn't support multiple inheritance of classes. Inoltre è necessario usare un'interfaccia se si vuole simulare l'ereditarietà per le struct, perché non possono effettivamente ereditare da un'altra struct o classe.In addition, you must use an interface if you want to simulate inheritance for structs, because they can't actually inherit from another struct or class.

Per definire un'interfaccia, è possibile usare la parola chiave Interface , come illustrato nell'esempio seguente.You define an interface by using the interface keyword as the following example shows.

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

Il nome di un'interfaccia deve essere un nome di identificatoreC# valido.The name of an interface must be a valid C# identifier name. Per convenzione, i nomi di interfaccia iniziano con una lettera I maiuscola.By convention, interface names begin with a capital I.

Qualsiasi classe o struct che implementa l'interfaccia IEquatable<T> deve contenere una definizione per un metodo Equals che corrisponde alla firma specificata dall'interfaccia.Any class or struct that implements the IEquatable<T> interface must contain a definition for an Equals method that matches the signature that the interface specifies. Di conseguenza, è possibile affidarsi a una classe che implementa IEquatable<T> per contenere un metodo Equals con cui un'istanza della classe può determinare se sia uguale a un'altra istanza della stessa classe.As a result, you can count on a class that implements IEquatable<T> to contain an Equals method with which an instance of the class can determine whether it's equal to another instance of the same class.

La definizione di IEquatable<T> non fornisce un'implementazione per Equals .The definition of IEquatable<T> doesn't provide an implementation for Equals. Una classe o uno struct può implementare più interfacce, ma una classe può ereditare solo da una singola classe.A class or struct can implement multiple interfaces, but a class can only inherit from a single class.

Per altre informazioni sulle classi astratte, vedere Classi e membri delle classi astratte e sealed.For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

Le interfacce possono contenere metodi di istanza, proprietà, eventi, indicizzatori o qualsiasi combinazione di questi quattro tipi di membri.Interfaces can contain instance methods, properties, events, indexers, or any combination of those four member types. Le interfacce possono contenere costruttori statici, campi, costanti o operatori.Interfaces may contain static constructors, fields, constants, or operators. Per collegamenti a esempi, vedere Sezioni correlate.For links to examples, see Related Sections. Un'interfaccia non può contenere campi di istanza, costruttori di istanza o finalizzatori.An interface can't contain instance fields, instance constructors, or finalizers. I membri di interfaccia sono public per impostazione predefinita ed è possibile specificare in modo esplicito i modificatori di accessibilità, ad esempio public ,, protected internal , private , protected internal o private protected .Interface members are public by default, and you can explicitly specify accessibility modifiers, such as public, protected, internal, private, protected internal, or private protected. Un private membro deve avere un'implementazione predefinita.A private member must have a default implementation.

Per implementare un membro di interfaccia, il corrispondente membro della classe di implementazione deve essere pubblico e non statico e avere lo stesso nome e la stessa firma del membro di interfaccia.To implement an interface member, the corresponding member of the implementing class must be public, non-static, and have the same name and signature as the interface member.

Quando una classe o uno struct implementa un'interfaccia, la classe o lo struct deve fornire un'implementazione per tutti i membri dichiarati dall'interfaccia, ma non fornisce un'implementazione predefinita per.When a class or struct implements an interface, the class or struct must provide an implementation for all of the members that the interface declares but doesn't provide a default implementation for. Tuttavia, se una classe base implementa un'interfaccia, qualsiasi classe derivata dalla classe base eredita tale implementazione.However, if a base class implements an interface, any class that's derived from the base class inherits that implementation.

Nell'esempio seguente viene illustrata un'implementazione dell'interfaccia IEquatable<T>.The following example shows an implementation of the IEquatable<T> interface. La classe di implementazione, Car, deve fornire un'implementazione del metodo Equals.The implementing class, Car, must provide an implementation of the Equals method.

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)
    {
        return (this.Make, this.Model, this.Year) ==
            (car.Make, car.Model, car.Year);
    }
}

Le proprietà e gli indicizzatori di una classe possono definire altre funzioni di accesso per una proprietà o un indicizzatore definito in un'interfaccia.Properties and indexers of a class can define extra accessors for a property or indexer that's defined in an interface. Ad esempio, un'interfaccia può dichiarare una proprietà con una funzione di accesso get.For example, an interface might declare a property that has a get accessor. La classe che implementa l'interfaccia può dichiarare la stessa proprietà con una funzione di accesso get o set.The class that implements the interface can declare the same property with both a get and set accessor. Tuttavia, se la proprietà o l'indicizzatore usa l'implementazione esplicita, le funzioni di accesso devono corrispondere.However, if the property or indexer uses explicit implementation, the accessors must match. Per altre informazioni sull'implementazione esplicita, vedere Implementazione esplicita dell'interfaccia e Proprietà dell'interfaccia.For more information about explicit implementation, see Explicit Interface Implementation and Interface Properties.

Le interfacce possono ereditare da una o più interfacce.Interfaces can inherit from one or more interfaces. L'interfaccia derivata eredita i membri dalle relative interfacce di base.The derived interface inherits the members from its base interfaces. Una classe che implementa un'interfaccia derivata deve implementare tutti i membri nell'interfaccia derivata, inclusi tutti i membri delle interfacce di base dell'interfaccia derivata.A class that implements a derived interface must implement all members in the derived interface, including all members of the derived interface's base interfaces. Tale classe può essere convertita in modo implicito nell'interfaccia derivata o in una delle interfacce di base.That class may be implicitly converted to the derived interface or any of its base interfaces. Una classe può includere un'interfaccia più volte tramite le classi di base ereditate o tramite le interfacce ereditate da altre interfacce.A class might include an interface multiple times through base classes that it inherits or through interfaces that other interfaces inherit. Tuttavia, la classe può fornire un'implementazione di un'interfaccia solo una volta e solo se la classe dichiara l'interfaccia durante la definizione della classe (class ClassName : InterfaceName).However, the class can provide an implementation of an interface only one time and only if the class declares the interface as part of the definition of the class (class ClassName : InterfaceName). Se l'interfaccia viene ereditata perché è stata ereditata una classe base che implementa l'interfaccia, la classe base fornisce l'implementazione dei membri dell'interfaccia.If the interface is inherited because you inherited a base class that implements the interface, the base class provides the implementation of the members of the interface. Tuttavia, la classe derivata può reimplementare qualsiasi membro dell'interfaccia invece di usare l'implementazione ereditata.However, the derived class can reimplement any virtual interface members instead of using the inherited implementation. Quando le interfacce dichiarano un'implementazione predefinita di un metodo, qualsiasi classe che implementa tale interfaccia eredita tale implementazione.When interfaces declare a default implementation of a method, any class implementing that interface inherits that implementation. Le implementazioni definite nelle interfacce sono virtuali e la classe di implementazione può eseguire l'override dell'implementazione.Implementations defined in interfaces are virtual and the implementing class may override that implementation.

Una classe base può implementare anche i membri di interfaccia usando membri virtuali.A base class can also implement interface members by using virtual members. In tal caso, una classe derivata può modificare il comportamento dell'interfaccia eseguendo l'override dei membri virtuali.In that case, a derived class can change the interface behavior by overriding the virtual members. Per altre informazioni su membri virtuali, vedere Polimorfismo.For more information about virtual members, see Polymorphism.

Riepilogo delle interfacceInterfaces summary

Un'interfaccia presenta le proprietà seguenti:An interface has the following properties:

  • Un'interfaccia è in genere simile a una classe di base astratta con solo membri astratti.An interface is typically like an abstract base class with only abstract members. Qualsiasi classe o struct che implementa l'interfaccia deve implementarne tutti i membri.Any class or struct that implements the interface must implement all its members. Facoltativamente, un'interfaccia può definire implementazioni predefinite per alcuni o tutti i relativi membri.Optionally, an interface may define default implementations for some or all of its members. Per altre informazioni, vedere metodi di interfaccia predefiniti.For more information, see default interface methods.
  • Non è possibile creare direttamente un'istanza di un'interfaccia.An interface can't be instantiated directly. I membri vengono implementati da qualsiasi classe o struct che implementa l'interfaccia.Its members are implemented by any class or struct that implements the interface.
  • Una classe o struct può implementare più interfacce.A class or struct can implement multiple interfaces. Una classe può ereditare una classe base e anche implementare una o più interfacce.A class can inherit a base class and also implement one or more interfaces.

Vedi ancheSee also