Interfacce (Visual Basic)
Le interfacce definiscono le proprietà, i metodi e gli eventi che le classi possono implementare. 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. È possibile aggiungere nuove funzionalità in qualsiasi momento sviluppando interfacce e implementazioni aggiuntive.
Le interfacce offrono anche altri vantaggi rispetto all'ereditarietà di classe:
Sono più adatte a situazioni in cui l'applicazione richiede molti tipi di oggetti anche non correlati per fornire determinate funzionalità.
Sono più flessibili delle classi base perché consentono di definire un'unica implementazione in grado di implementare più interfacce.
Sono più adatte in situazioni in cui non è necessario ereditare l'implementazione da una classe base.
Vengono utilizzate laddove non è possibile utilizzare l'ereditarietà di classe. Le strutture non possono ad esempio ereditare dalle classi ma possono implementare interfacce.
Interfacce di dichiarazione
Le definizioni di interfaccia sono racchiuse tra le istruzioni Interface ed End Interface. Subito dopo l'istruzione Interface è possibile aggiungere un'istruzione Inherits facoltativa in cui sono elencate una o più interfacce ereditate. È necessario che l'istruzione Inherits preceda qualsiasi altra istruzione della dichiarazione, ad eccezione dei commenti. Le restanti istruzioni della definizione di interfaccia dovrebbero essere istruzioni Event, Sub, Function, Property, Interface, Class, Structure e Enum. Le interfacce non possono contenere codice di implementazione o istruzioni ad esso associate, come End Sub o 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. 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.
Nota
La parola chiave Shadows può essere applicata a tutti i membri dell'interfaccia.La parola chiave Overloads può essere applicata alle istruzioni Sub, Function e Property dichiarate in una definizione di interfaccia.Inoltre, le istruzioni Property possono includere il modificatore Default, ReadOnly o WriteOnly.Non sono consentiti altri modificatori, come Public, Private, Friend, Protected, Shared, Overrides, MustOverride o Overridable.Per ulteriori informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti (Visual Basic).
Il codice riportato di seguito, ad esempio, consente di definire un'interfaccia con una funzione, una proprietà e un evento.
Interface IAsset
Event ComittedChange(ByVal Success As Boolean)
Property Division() As String
Function GetID() As Integer
End Interface
Implementazione di interfacce
La parola riservata Implements di Visual Basic viene utilizzata in due modi: L'istruzione Implements indica che una classe o una struttura implementa un'interfaccia. La parola chiave Implements indica che un membro di classe o di struttura implementa un membro di interfaccia specifico.
Istruzione Implements
Se una classe o una struttura implementa una o più interfacce, deve includere l'istruzione Implements immediatamente dopo l'istruzione Class o Structure. L'istruzione Implements richiede un elenco separato da virgole di interfacce implementate da una classe. La classe o la struttura deve implementare tutti i membri di interfaccia mediante la parola chiave Implements.
Parola chiave Implements
La parola chiave Implements richiede un elenco separato da virgole di membri di interfaccia da implementare. In genere viene specificato un solo membro dell'interfaccia, anche se è possibile specificarne diversi. La specifica di un membro di un'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. Il nome di un membro che implementa un membro di interfaccia può utilizzare qualsiasi identificatore valido e non è limitato alla convenzione InterfaceName_MethodName utilizzata nelle versioni precedenti di Visual Basic.
Nel codice che segue, ad esempio, viene illustrato come dichiarare una subroutine denominata Sub1 che implementa un metodo di un'interfaccia:
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. Per implementare un elemento di un'interfaccia in genere si utilizza un membro con lo stesso nome dell'interfaccia, come illustrato nell'esempio riportato sopra.
Per dichiarare l'implementazione di un metodo di interfaccia, è possibile utilizzare 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. L'attributo Shared non è valido in quanto definisce una classe anziché un metodo di istanza.
L'utilizzo di Implements consente di scrivere un unico metodo che implementa più metodi definiti in un'interfaccia, come nell'esempio che segue:
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 utilizzare un membro privato. Quando un membro privato implementa un membro di un'interfaccia, tale membro diventa disponibile tramite l'interfaccia anche se non è disponibile direttamente sulle variabili oggetto della classe.
Esempi si implementazione dell'interfaccia
È necessario che le classi che implementano un'interfaccia ne implementino tutte le proprietà, i metodi e gli eventi.
Nell'esempio seguente vengono definite due interfacce. La seconda interfaccia, Interface2, eredita Interface1 e definisce una proprietà e un metodo aggiuntivi.
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 seguente consente di implementare Interface1, l'interfaccia definita nell'esempio precedente:
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 consente di implementare Interface2, incluso un metodo ereditato da 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
Argomenti correlati
Titolo |
Descrizione |
---|---|
Procedura dettagliata: creazione e implementazione di interfacce (Visual Basic) |
Viene fornita una procedura dettagliata che illustra il processo di definizione e implementazione di interfacce personalizzate. |
Vengono illustrate la covarianza e la controvarianza nelle interfacce generiche e viene fornito un elenco di varie interfacce generiche in .NET Framework. |