Programmazione orientata agli oggetti (Visual Basic)

Visual Basic offre supporto completo per la programmazione orientata agli oggetti, tra cui 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 fornisce anche una versione leggera di classi denominate strutture utili quando è necessario creare una matrice di oggetti di grandi dimensioni e non si vuole utilizzare troppo memoria per tale elemento.

Per definire una struttura:

Structure SampleStructure
End Structure

Per altre informazioni, vedere:

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 usare le proprietà implementate automaticamente che creano automaticamente questo campo in background e forniscono la logica di base per le procedure 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, vedere:

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 supporta tuttavia anche metodi di estensione che consentono di aggiungere metodi a una classe esistente all'esterno della definizione effettiva della classe.

Per altre informazioni, vedere:

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: Modalità di creazione e eliminazione 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.

Eventi

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.

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.
Protetto 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 delle 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, vedere:

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 possono essere create istanze. I membri condivisi non possono accedere anche a proprietà, campi o metodi non condivisi

Per altre informazioni, vedere:

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 di base, mentre la classe che eredita tali membri è denominata classe derivata. Tuttavia, tutte le classi in Visual Basic ereditano in modo implicito dalla Object classe che supporta la gerarchia di classi .NET e forniscono 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, vedere:

Override dei 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.
Override 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.
Ombreggiature 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, vedere:

Generics

Le classi, le strutture, le interfacce e i metodi in .NET possono includere parametri di tipo che definiscono tipi di oggetti che possono 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, vedere:

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, vedere:

Vedi anche