Interfacce (Visual Basic)Interfaces (Visual Basic)

Le interfacce definiscono le proprietà, i metodi e gli eventi che le classi possono implementare.Interfaces define the properties, methods, and events that classes can implement. Le interfacce consentono di definire funzionalità come piccoli gruppi di proprietà, metodi ed eventi strettamente correlati fra loro. In questo modo si riducono i problemi di compatibilità, grazie alla possibilità di sviluppare implementazioni migliorate per le interfacce senza compromettere il codice esistente.Interfaces allow you to define features as small groups of closely related properties, methods, and events; this reduces compatibility problems because you can develop enhanced implementations for your interfaces without jeopardizing existing code. È possibile aggiungere nuove funzionalità in qualsiasi momento, sviluppando interfacce e implementazioni aggiuntive.You can add new features at any time by developing additional interfaces and implementations.

Le interfacce offrono anche altri vantaggi rispetto all'ereditarietà di classe:There are several other reasons why you might want to use interfaces instead of class inheritance:

  • Sono più adatte a situazioni in cui l'applicazione richiede molti tipi di oggetti anche non correlati per fornire determinate funzionalità.Interfaces are better suited to situations in which your applications require many possibly unrelated object types to provide certain functionality.

  • Sono più flessibili delle classi base perché consentono di definire un'unica implementazione in grado di implementare più interfacce.Interfaces are more flexible than base classes because you can define a single implementation that can implement multiple interfaces.

  • Sono più adatte nelle situazioni in cui non è necessario ereditare l'implementazione da una classe base.Interfaces are better in situations in which you do not have to inherit implementation from a base class.

  • Sono utili quando non è possibile usare l'ereditarietà di classe.Interfaces are useful when you cannot use class inheritance. Le strutture, ad esempio, non possono ereditare dalle classi, ma possono implementare interfacce.For example, structures cannot inherit from classes, but they can implement interfaces.

Dichiarazione di interfacceDeclaring Interfaces

Le definizioni di interfaccia sono racchiuse tra istruzioni Interface e End Interface.Interface definitions are enclosed within the Interface and End Interface statements. Subito dopo l'istruzione Interface è possibile aggiungere un'istruzione Inherits facoltativa in cui sono elencate una o più interfacce ereditate.Following the Interface statement, you can add an optional Inherits statement that lists one or more inherited interfaces. Le istruzioni Inherits devono precedere qualsiasi altra istruzione della dichiarazione, ad eccezione dei commenti.The Inherits statements must precede all other statements in the declaration except comments. Le restanti istruzioni della definizione di interfaccia dovrebbero essere istruzioni Event, Sub, Function, Property, Interface, Class, Structure e Enum.The remaining statements in the interface definition should be Event, Sub, Function, Property, Interface, Class, Structure, and Enum statements. Le interfacce non possono contenere codice di implementazione o istruzioni ad esso associate, come End Sub o End Property.Interfaces cannot contain any implementation code or statements associated with implementation code, such as End Sub or End Property.

Per impostazione predefinita, in uno spazio dei nomi le istruzioni di interfaccia sono Friend, ma possono anche essere dichiarate in modo esplicito come Public o Friend.In a namespace, interface statements are Friend by default, but they can also be explicitly declared as Public or Friend. Per impostazione predefinita, le interfacce definite all'interno di classi, moduli, interfacce e strutture sono Public, ma possono anche essere dichiarate in modo esplicito come Public, Friend, Protected o Private.Interfaces defined within classes, modules, interfaces, and structures are Public by default, but they can also be explicitly declared as Public, Friend, Protected, or Private.

Nota

La parola chiave Shadows può essere applicata a tutti i membri dell'interfaccia.The Shadows keyword can be applied to all interface members. La parola chiave Overloads può essere applicata alle istruzioni Sub, Function e Property dichiarate in una definizione di interfaccia.The Overloads keyword can be applied to Sub, Function, and Property statements declared in an interface definition. Inoltre, le istruzioni Property possono includere il modificatore Default, ReadOnly o WriteOnly.In addition, Property statements can have the Default, ReadOnly, or WriteOnly modifiers. Non sono consentiti altri modificatori, come Public, Private, Friend, Protected, Shared, Overrides, MustOverride o Overridable.None of the other modifiers—Public, Private, Friend, Protected, Shared, Overrides, MustOverride, or Overridable—are allowed. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.For more information, see Declaration Contexts and Default Access Levels.

Il codice riportato di seguito, ad esempio, consente di definire un'interfaccia con una funzione, una proprietà e un evento.For example, the following code defines an interface with one function, one property, and one event.

Interface IAsset
    Event ComittedChange(ByVal Success As Boolean)
    Property Division() As String
    Function GetID() As Integer
End Interface

Implementazione di interfacceImplementing Interfaces

Parola riservata di Visual Basic Implements viene usato in due modi.The Visual Basic reserved word Implements is used in two ways. L'istruzione Implements indica che una classe o una struttura implementa un'interfaccia.The Implements statement signifies that a class or structure implements an interface. La parola chiave Implements indica che un membro di classe o di struttura implementa un membro di interfaccia specifico.The Implements keyword signifies that a class member or structure member implements a specific interface member.

Istruzione ImplementsImplements Statement

Se una classe o una struttura implementa una o più interfacce, deve includere l'istruzione Implements immediatamente dopo l'istruzione Class o Structure.If a class or structure implements one or more interfaces, it must include the Implements statement immediately after the Class or Structure statement. L'istruzione Implements richiede un elenco separato da virgole di interfacce implementate da una classe.The Implements statement requires a comma-separated list of interfaces to be implemented by a class. La classe o la struttura deve implementare tutti i membri di interfaccia mediante la parola chiave Implements.The class or structure must implement all interface members using the Implements keyword.

Parola chiave ImplementsImplements Keyword

La parola chiave Implements richiede un elenco separato da virgole di membri di interfaccia da implementare.The Implements keyword requires a comma-separated list of interface members to be implemented. In genere viene specificato un solo membro di interfaccia, anche se è possibile specificarne diversi.Generally, only a single interface member is specified, but you can specify multiple members. La specifica di un membro di interfaccia è composta dal nome dell'interfaccia, che è necessario includere in un'istruzione Implements all'interno della classe, seguito da un punto, quindi dal nome della funzione, della proprietà o dell'evento da implementare.The specification of an interface member consists of the interface name, which must be specified in an implements statement within the class; a period; and the name of the member function, property, or event to be implemented. Il nome di un membro che implementa un membro di interfaccia può utilizzare qualsiasi identificatore valido e non è limitato al InterfaceName_MethodName convenzione usata nelle versioni precedenti di Visual Basic.The name of a member that implements an interface member can use any legal identifier, and it is not limited to the InterfaceName_MethodName convention used in earlier versions of Visual Basic.

Il codice seguente, ad esempio, illustra come dichiarare una subroutine denominata Sub1 che implementa un metodo di un'interfaccia:For example, the following code shows how to declare a subroutine named Sub1 that implements a method of an interface:

Class Class1
    Implements interfaceclass.interface2

    Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1
    End Sub
End Class

È necessario che i tipi di parametro e i tipi restituiti del membro che esegue l'implementazione corrispondano alla proprietà dell'interfaccia o alla dichiarazione del membro nell'interfaccia.The parameter types and return types of the implementing member must match the interface property or member declaration in the interface. Per implementare un elemento di un'interfaccia in genere si usa un membro con lo stesso nome dell'interfaccia, come illustrato nell'esempio precedente.The most common way to implement an element of an interface is with a member that has the same name as the interface, as shown in the previous example.

Per dichiarare l'implementazione di un metodo di interfaccia è possibile usare qualsiasi attributo valido per le dichiarazioni dei metodi di istanza, tra cui Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default e Static.To declare the implementation of an interface method, you can use any attributes that are legal on instance method declarations, including Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default, and Static. L'attributo Shared non è valido in quanto definisce una classe anziché un metodo di istanza.The Shared attribute is not legal since it defines a class rather than an instance method.

Usando Implements è possibile scrivere un unico metodo che implementa più metodi definiti in un'interfaccia, come nell'esempio seguente:Using Implements, you can also write a single method that implements multiple methods defined in an interface, as in the following example:

Class Class2
    Implements I1, I2

    Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
    End Sub
End Class

Per implementare un membro di interfaccia, è possibile usare un membro privato.You can use a private member to implement an interface member. Quando un membro privato implementa un membro di un'interfaccia, diventa disponibile tramite l'interfaccia anche se non è disponibile direttamente sulle variabili oggetto della classe.When a private member implements a member of an interface, that member becomes available by way of the interface even though it is not available directly on object variables for the class.

Esempi di implementazione dell'interfacciaInterface Implementation Examples

È necessario che le classi che implementano un'interfaccia ne implementino tutte le proprietà, i metodi e gli eventi.Classes that implement an interface must implement all its properties, methods, and events.

L'esempio seguente definisce due interfacce.The following example defines two interfaces. La seconda interfaccia, Interface2, eredita Interface1 e definisce una proprietà e un metodo aggiuntivi.The second interface, Interface2, inherits Interface1 and defines an additional property and method.

Interface Interface1
    Sub sub1(ByVal i As Integer)
End Interface

' Demonstrates interface inheritance.
Interface Interface2
    Inherits Interface1
    Sub M1(ByVal y As Integer)
    ReadOnly Property Num() As Integer
End Interface

L'esempio che segue implementa Interface1, l'interfaccia definita nell'esempio precedente:The next example implements Interface1, the interface defined in the previous example:

Public Class ImplementationClass1
    Implements Interface1
    Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
        ' Insert code here to implement this method.
    End Sub
End Class

L'ultimo esempio implementa Interface2, incluso un metodo ereditato da Interface1:The final example implements Interface2, including a method inherited from Interface1:

Public Class ImplementationClass2
    Implements Interface2
    Dim INum As Integer = 0
    Sub sub1(ByVal i As Integer) Implements Interface2.sub1
        ' Insert code here that implements this method.
    End Sub
    Sub M1(ByVal x As Integer) Implements Interface2.M1
        ' Insert code here to implement this method.
    End Sub

    ReadOnly Property Num() As Integer Implements Interface2.Num
        Get
            Num = INum
        End Get
    End Property
End Class

È possibile implementare una proprietà ReadOnly usando una proprietà ReadWrite (in altri termini, non è necessario dichiararla ReadOnly nella classe di implementazione).You can implement a readonly property with a readwrite property (that is, you do not have to declare it readonly in the implementing class). L'implementazione di un'interfaccia consente di implementare almeno i membri dichiarati dall'interfaccia, ma è possibile offrire maggiori funzionalità, ad esempio rendendo la proprietà accessibile in scrittura.Implementing an interface promises to implement at least the members that the interface declares, but you can offer more functionality, such as allowing your property to be writable.

TitoloTitle DescrizioneDescription
Procedura dettagliata: Creazione e implementazione di interfacceWalkthrough: Creating and Implementing Interfaces Fornisce una procedura dettagliata che illustra il processo di definizione e implementazione di interfacce personalizzate.Provides a detailed procedure that takes you through the process of defining and implementing your own interface.
Varianza nelle interfacce genericheVariance in Generic Interfaces Illustra la covarianza e la controvarianza nelle interfacce generiche e fornisce un elenco di interfacce generiche variant in .NET Framework.Discusses covariance and contravariance in generic interfaces and provides a list of variant generic interfaces in the .NET Framework.