Programmazione orientata a oggetti (Visual Basic)
Visual Basic offre un supporto completo per la programmazione orientata a oggetti che include incapsulamento, ereditarietà e polimorfismo.
L'incapsulamento indica che un gruppo di proprietà, metodi e altri membri correlati vengono considerati come una singola unità o un singolo oggetto.
L'ereditarietà indica la capacità di creare nuove classi sulla base di una classe esistente.
Il polimorfismo indica la capacità di usare più classi in modo intercambiabile, anche se in ognuna di esse le stesse proprietà o gli stessi metodi sono implementati in modi diversi.
In questa sezione vengono descritti i concetti seguenti:
Classi e oggetti
I termini classe e oggetto vengono talvolta usati in modo intercambiabile. Di fatto, però, le classi descrivono il tipo degli oggetti, mentre gli oggetti sono istanze utilizzabili delle classi. L'atto di creare un oggetto viene pertanto chiamato creazione di istanze. Rifacendoci all'analogia precedente, la classe corrisponde al progetto iniziale e l'oggetto all'edificio realizzato in base a tale progetto.
Per definire una classe:
Class SampleClass
End Class
Visual Basic offre anche classi in versione ridotta chiamate strutture, che risultano utili quando è necessario creare una matrice di grandi dimensioni di oggetti e non si vuole usare a tale scopo una quantità eccessiva di memoria.
Per definire una struttura:
Structure SampleStructure
End Structure
Per altre informazioni, vedi:
Membri di classe
Ogni classe può avere membri di classe diversi che includono proprietà che descrivono i dati della classe, i metodi che definiscono il comportamento della classe e gli eventi che offrono la comunicazione tra classi e oggetti diversi.
Proprietà e campi
I campi e le proprietà rappresentano le informazioni contenute in un oggetto. I campi sono simili a variabili in quanto possono essere letti o impostati direttamente.
Per definire un campo:
Class SampleClass
Public SampleField As String
End Class
Le proprietà dispongono di routine Get e Set, che forniscono un maggiore controllo sul modo in cui i valori vengono impostati o restituiti.
Visual Basic consente di creare un campo privato per archiviare il valore della proprietà o di utilizzare le cosiddette proprietà implementate automaticamente che creano automaticamente questo campo in background e forniscono la logica di base per le routine delle proprietà.
Per definire una proprietà implementata automaticamente:
Class SampleClass
Public Property SampleProperty as String
End Class
Se è necessario eseguire alcune operazioni aggiuntive per la lettura e la scrittura del valore della proprietà, definire un campo per archiviare il valore della proprietà e fornire la logica di base per archiviarlo e recuperarlo:
Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
La maggior parte delle proprietà dispone di metodi o di routine per impostare e ottenere il valore della proprietà. È possibile, tuttavia, creare proprietà di sola lettura o di sola scrittura per impedirne la modifica o la lettura. In Visual Basic è possibile utilizzare le parole chiave ReadOnly
e WriteOnly
. Tuttavia, le proprietà implementate automaticamente non possono essere di sola lettura o di sola scrittura.
Per altre informazioni, vedi:
Metodi
Un metodo è un'azione che può essere eseguita da un oggetto.
Nota
In Visual Basic, è possibile creare un metodo in due modi: se il metodo non restituisce un valore, viene utilizzata l'istruzione Sub
, se invece un metodo restituisce un valore, viene utilizzata l'istruzione Function
.
Per definire un metodo di una classe:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
Una classe può disporre di diverse implementazioni, o overload, dello stesso metodo che differiscono per il numero di parametri o per i tipi di parametro.
Per essere in rapporto di overload con un metodo:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Nella maggior parte dei casi si dichiara un metodo all'interno di una definizione della classe. Visual Basic, tuttavia, supporta anche i metodi di estensione che consentono di aggiungere metodi a una classe esistente al di fuori della definizione effettiva della classe.
Per altre informazioni, vedi:
Costruttori
I costruttori sono metodi di classe che vengono eseguiti automaticamente durante la creazione di un oggetto di un tipo specifico. I costruttori in genere inizializzano i membri dati del nuovo oggetto. Un costruttore può essere eseguito solo una volta alla creazione di una classe. Inoltre, il codice nel costruttore viene sempre eseguito prima di qualsiasi altro codice in una classe. Tuttavia, è possibile creare più overload del costruttore esattamente come per qualsiasi altro metodo.
Per definire un costruttore per una classe:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
Per altre informazioni, vedere Durata dell'oggetto: creazione ed eliminazione definitiva degli oggetti.
Distruttori
I distruttori sono utilizzati per distruggere istanze di classi. In .NET Framework, il Garbage Collector gestisce l'allocazione e il rilascio di memoria per gli oggetti gestiti di un'applicazione. Potrebbero, tuttavia, essere necessari distruttori per pulire eventuali risorse non gestite create dall'applicazione. Può esistere un solo distruttore per classe.
Per altre informazioni sui distruttori e sull'operazione di Garbage Collection in .NET Framework, vedere Garbage Collection.
evento
Tramite gli eventi una classe o un oggetto sono in grado di segnalare ad altre classi o oggetti una situazione di interesse. La classe che invia o genera l'evento è chiamata editore e le classi che ricevono o gestiscono l'evento sono chiamate sottoscrittori. Per altre informazioni sugli eventi e sulla loro generazione e gestione, vedere Eventi.
Per dichiarare gli eventi, usare l'Istruzione Event.
Per generare eventi, usare l'Istruzione RaiseEvent.
Per specificare gestori di eventi usando un modo dichiarativo, usare l'istruzione WithEvents e la clausola Handles.
Per poter aggiungere, rimuovere e modificare dinamicamente il gestore dell'evento associato a un evento, usare l'Istruzione AddHandler e l'Istruzione RemoveHandler insieme all'Operatore AddressOf.
Classi annidate
Una classe definita all'interno di un'altra classe è denominata annidata. Per impostazione predefinita, la classe annidata è privata.
Class Container
Class Nested
' Add code here.
End Class
End Class
Per creare un'istanza della classe annidata, utilizzare il nome della classe dei contenitori seguita dal punto, quindi dal nome della classe annidata:
Dim nestedInstance As Container.Nested = New Container.Nested()
Modificatori di accesso e livelli di accesso
Tutte le classi e i membri della classe possono specificare il livello di accesso offerto alle altre classi usando i modificatori di accesso.
Sono disponibili i seguenti modificatori di accesso:
Modificatore di Visual Basic | Definizione |
---|---|
Pubblica | Il tipo o il membro è accessibile da altro codice nello stesso assembly o in un altro assembly che vi fa riferimento. |
Privata | Il tipo o il membro è accessibile solo dal codice nella stessa classe. |
Protected | Il tipo o il membro è accessibile solo dal codice nella stessa classe o in una classe derivata. |
Friend | Il tipo o il membro è accessibile dal codice nello stesso assembly ma non da un altro assembly. |
Protected Friend |
Il tipo o il membro è accessibile dal codice nello stesso assembly o da una classe derivata in un altro assembly. |
Per altre informazioni, vedere Livelli di accesso in Visual Basic.
Creazione di istanze di classi
Per creare un oggetto, è necessario creare un'istanza di una classe.
Dim sampleObject as New SampleClass()
Dopo avere creato un'istanza di una classe, è possibile assegnare i valori alle proprietà e ai campi dell'istanza e richiamare i metodi della classe.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
Per assegnare i valori alle proprietà durante il processo di creazione dell'istanza della classe, utilizzare gli inizializzatori di oggetto:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
Per altre informazioni, vedi:
Classi e membri condivisi
Un membro condiviso della classe è una proprietà, una routine o un campo condiviso da tutte le istanze di una classe.
Per definire un membro condiviso:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Per accedere al membro condiviso, usare il nome della classe senza creare un oggetto di questa classe:
MsgBox(SampleClass.SampleString)
I moduli condivisi in Visual Basic hanno solo membri condivisi e non è possibile crearne istanze. I membri condivisi non possono inoltre accedere a proprietà, campi o metodi non condivisi
Per altre informazioni, vedi:
Tipi anonimi
I tipi anonimi consentono di creare oggetti senza scrivere una definizione della classe per il tipo di dati. La classe viene generata direttamente dal compilatore. La classe non ha un nome utilizzabile e contiene le proprietà specificate nella dichiarazione dell'oggetto.
Per creare un'istanza di un tipo anonimo:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
Per altre informazioni, vedere Tipi anonimi.
Ereditarietà
L'ereditarietà permette di creare una nuova classe che riutilizza, estende e modifica il comportamento definito in un'altra classe. La classe i cui membri vengono ereditati è denominata classe base, mentre la classe che eredita i membri è denominata classe derivata. Tuttavia, tutte le classi in Visual Basic ereditano in modo implicito dalla classe Object che supporta la gerarchia di classi .NET e offre servizi di basso livello a tutte le classi.
Nota
Visual Basic non supporta l'ereditarietà multipla. Vale a dire, è possibile specificare una sola classe base per una classe derivata.
Per ereditare da una classe base:
Class DerivedClass
Inherits BaseClass
End Class
Per impostazione predefinita, tutte le classi possono essere ereditate. Tuttavia, è possibile specificare se una classe non deve essere utilizzata come classe base oppure creare una classe utilizzabile solo come classe base.
Per specificare che una classe non può essere utilizzata come classe base:
NotInheritable Class SampleClass
End Class
Per specificare che una classe può essere utilizzata solo come classe base e che non è possibile crearne un'istanza:
MustInherit Class BaseClass
End Class
Per altre informazioni, vedi:
Override di membri
Per impostazione predefinita, in una classe derivata vengono ereditati tutti i membri della classe base relativa. Se si desidera modificare il comportamento del membro ereditato, è necessario eseguirne l'override. È possibile definire una nuova implementazione del metodo, della proprietà o dell'evento nella classe derivata.
I seguenti modificatori consentono di controllare le modalità di override di proprietà e metodi:
Modificatore di Visual Basic | Definizione |
---|---|
Overridable | Consente a un membro della classe di essere sottoposto a override in una classe derivata. |
Overrides | Esegue l'override di un membro virtuale (sottoponibile a override) definito nella classe base. |
NotOverridable | Consente di impedire l'override di un membro in una classe che eredita. |
MustOverride | Richiede che un membro della classe venga sottoposto a override nella classe derivata. |
Shadows | Nasconde un membro ereditato da una classe base. |
Interfacce
Le interfacce, come le classi, consentono di definire un insieme di proprietà, metodi ed eventi. A differenza delle classi, però, le interfacce non forniscono l'implementazione. Esse sono infatti implementate dalle classi e definite come entità distinte da queste. Un'interfaccia rappresenta un contratto, in quanto è necessario che una classe che implementa un'interfaccia implementi ogni aspetto esattamente come è stato definito.
Per definire un'interfaccia:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
Per implementare un'interfaccia in una classe:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Per altre informazioni, vedi:
Generics
Classi, strutture, interfacce e metodi in .NET possono includere parametri di tipo che definiscono i tipi di oggetti che sono in grado di archiviare o usare. L'esempio più comune di generics è una raccolta, dove è possibile specificare il tipo di oggetti da archiviare in una raccolta.
Per definire una classe generica:
Class SampleGeneric(Of T)
Public Field As T
End Class
Per creare un'istanza di una classe generica:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
Per altre informazioni, vedi:
Delegati
Un delegato è un tipo che definisce una firma di metodo e può offrire un riferimento a qualsiasi metodo con una firma compatibile. Tramite il delegato è possibile invocare (o chiamare) il metodo. I delegati vengono utilizzati per passare metodi come argomenti ad altri metodi.
Nota
I gestori di evento non sono altro che metodi richiamati tramite delegati. Per altre informazioni sull'uso dei delegati nella gestione degli eventi, vedere Eventi.
Per creare un delegato:
Delegate Sub SampleDelegate(ByVal str As String)
Per creare un riferimento a un metodo che corrisponde alla firma specificata dal delegato:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
Per altre informazioni, vedi: