Oggetti e classi in Visual Basic

Un oggetto è una combinazione di codice e dati che è possibile considerare come singola unità. Un oggetto può essere una parte di un'applicazione, come un controllo o un form. Anche un'intera applicazione può essere un oggetto.

Durante la creazione di un'applicazione in Visual Basic si utilizzano costantemente degli oggetti. È possibile utilizzare oggetti forniti da Visual Basic, come ad esempio controlli, form e oggetti di accesso ai dati. È anche possibile utilizzare oggetti di altre applicazioni all'interno dell'applicazione Visual Basic che si sta sviluppando. È possibile inoltre creare oggetti personalizzati e definire per essi proprietà e metodi supplementari. Per i programmi, gli oggetti svolgono la stessa funzione dei blocchi predefiniti prefabbricati: essi consentono di scrivere un pezzo di codice una sola volta e di riutilizzarlo ripetutamente.

In questo argomento vengono fornite informazioni dettagliate sugli oggetti.

Oggetti e classi

Ogni oggetto di Visual Basic è definito da una classe che ne descrive le variabili, le proprietà, le routine e gli eventi. Gli oggetti sono istanze di classi. Una volta definita una classe, sarà possibile creare tutti gli oggetti necessari.

Per comprendere la relazione esistente tra un oggetto e la relativa classe di appartenenza, si pensi agli stampi per biscotti e ai biscotti. La classe è lo stampo che definisce le caratteristiche di ogni biscotto, quali dimensioni e forma. La classe viene utilizzata per creare oggetti. Gli oggetti sono i biscotti.

Per poter accedere ai membri di un oggetto, è prima necessario creare l'oggetto.

Per creare un oggetto da una classe

  1. Scegliere la classe da cui si desidera creare un oggetto.

  2. Scrivere un'Istruzione Dim (Visual Basic) per creare una variabile a cui è possibile assegnare un'istanza di una classe. La variabile dovrebbe essere del tipo della classe desiderata.

    Dim nextCustomer As customer 
    
  3. Aggiungere la parola chiave Operatore New (Visual Basic) per inizializzare la variabile su una nuova istanza della classe.

    Dim nextCustomer As New customer
    
  4. È ora possibile accedere ai membri della classe mediante la variabile oggetto.

    nextCustomer.accountNumber = lastAccountNumber + 1
    

Nota

Laddove possibile, è necessario dichiarare che la variabile appartiene al tipo di classe a cui si intende assegnarla. Questa operazione viene definita associazione anticipata. Se il tipo di classe non è noto in fase di compilazione, è possibile richiamare l'associazione tardiva dichiarando che la variabile è del Tipo di dati Object. Questo tipo di associazione comporta tuttavia il rischio di un rallentamento delle prestazioni e di una limitazione dell'accesso ai membri dell'oggetto in fase di esecuzione. Per ulteriori informazioni, vedere Dichiarazione di variabili oggetto (Visual Basic).

Istanze multiple

Gli oggetti creati da una classe sono spesso identici. Una volta definiti come singoli oggetti, è comunque possibile modificarne le variabili e le proprietà indipendentemente dalle altre istanze. Se si aggiungono a un form tre caselle di controllo, ad esempio, ogni oggetto casella di controllo è un'istanza della classe CheckBox. I singoli oggetti CheckBox condividono un insieme di caratteristiche e funzionalità, come proprietà, variabili, routine ed eventi, definite dalla classe. Ognuno di essi, tuttavia, ha un proprio nome, può essere abilitato e disabilitato separatamente e può essere posizionato in un punto diverso del form.

Membri degli oggetti

Un oggetto è un elemento di un'applicazione che rappresenta un'istanza di una classe. I campi, le proprietà, i metodi e gli eventi sono i blocchi predefiniti degli oggetti e ne costituiscono i membri.

Accesso ai membri

Per accedere a un membro di un oggetto, è necessario specificare il nome della variabile oggetto, un punto (.) e il nome del membro, nell'ordine indicato. Nell'esempio riportato di seguito viene impostata la proprietà Text di un oggetto Label.

warningLabel.Text = "Data not saved"

Elenco di membri IntelliSense

Quando si richiama l'opzione Elenca membri relativa a una classe, ad esempio quando si digita un punto (.) come operatore di accesso ai membri, IntelliSense elenca i membri della classe. Se si digita il punto dopo il nome di una variabile dichiarata come istanza della classe, vengono elencati tutti i membri di istanza ma nessuno dei membri condivisi. Se si digita il punto dopo il nome della classe, vengono elencati tutti i membri condivisi ma nessuno dei membri di istanza. Per ulteriori informazioni, vedere Utilizzo di IntelliSense.

Campi e proprietà

I campi e le proprietà rappresentano le informazioni archiviate in un oggetto. È possibile utilizzare istruzioni di assegnazione per recuperare e impostare i valori dei campi e delle proprietà, nello stesso modo in cui vengono recuperate e impostate le variabili locali di una routine. Nell'esempio riportato di seguito viene recuperata la proprietà Width e impostata la proprietà ForeColor di un oggetto Label.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Un campo è anche detto variabile membro.

Utilizzare le routine delle proprietà nei casi seguenti:

  • È necessario controllare quando e come un valore viene impostato o recuperato.

  • La proprietà contiene un insieme di valori ben definito che è necessario convalidare.

  • L'impostazione di un valore determina modifiche percettibili nello stato dell'oggetto, ad esempio a una proprietà IsVisible.

  • L'impostazione della proprietà provoca modifiche ad altre variabili interne o ai valori di altre proprietà.

  • È necessario eseguire una serie di passaggi prima dell'impostazione o del recupero della proprietà.

Utilizzare i campi nei seguenti casi:

  • Il valore è di tipo auto-convalidante. Si verifica ad esempio un errore o una conversione automatica di dati se a una variabile Boolean viene assegnato un valore diverso da True o False.

  • Tutti i valori nell'intervallo supportato dal tipo di dati sono validi, ad esempio nel caso di molte proprietà di tipo Single o Double.

  • La proprietà è un tipo di dati String e non vi è alcun vincolo sulla dimensione o il valore della stringa.

  • Per ulteriori informazioni, vedere Routine Property (Visual Basic).

Metodi

Un metodo è un'azione che può essere eseguita da un oggetto. Ad esempio, Add è un metodo dell'oggetto ComboBox che consente di aggiungere una nuova voce a una casella combinata.

Nell'esempio riportato di seguito viene illustrato il metodo Start di un oggetto Timer.

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Un metodo è semplicemente una routine esposta da un oggetto.

Per ulteriori informazioni, vedere Routine in Visual Basic.

Eventi

Un evento è un'azione che viene riconosciuta da un oggetto, come il clic del mouse o la pressione di un tasto, e alla quale è possibile rispondere mediante un codice scritto appositamente. Gli eventi possono verificarsi come conseguenza di un'azione utente o un codice di programma oppure possono essere generati dal sistema. Il codice che segnala un evento è detto codice che genera l'evento mentre il codice che risponde a un evento è detto codice che gestisce l'evento.

È inoltre possibile sviluppare eventi personalizzati generati dai propri oggetti e gestiti da altri oggetti. Per ulteriori informazioni, vedere Eventi (Visual Basic).

Membri di istanza e membri condivisi

Quando si crea un oggetto da una classe, il risultato è un'istanza della classe. I membri non dichiarati con la parola chiave Shared (Visual Basic) sono membri di istanza e appartengono soltanto alla particolare istanza. Un membro di istanza appartenente a una determinata istanza è indipendente dallo stesso membro appartenente a un'altra istanza della stessa classe. Una variabile membro di istanza, ad esempio, può avere valori differenti in istanze differenti.

I membri dichiarati con la parola chiave Shared sono membri condivisi e appartengono all'intera classe e non a una particolare istanza. Un membro condiviso viene definito una sola volta, indipendentemente dal numero di istanze della relativa classe create (anche se non viene creata alcuna istanza). Una variabile membro condiviso, ad esempio, può avere un unico valore, che può essere utilizzato da tutte le parti di codice che possono accedere alla classe.

Accesso a membri non condivisi

Per accedere a un membro non condiviso di un oggetto

  1. Accertarsi che l'oggetto sia stato creato a partire dalla rispettiva classe e che sia stato assegnato a una variabile oggetto.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. Nell'istruzione che consente l'accesso al membro inserire il nome della variabile oggetto, quindi l'operatore di accesso ai membri (.) e infine il nome del membro.

    secondForm.Show()
    

Accesso a membri condivisi

Per accedere a un membro condiviso di un oggetto

  • Inserire il nome della classe, quindi l'operatore di accesso ai membri (.) e infine il nome del membro. È necessario accedere sempre a un membro Shared dell'oggetto tramite il nome della classe.

    MsgBox("This computer is called " & Environment.MachineName)
    
  • In alternativa, se è già stato creato un oggetto a partire dalla classe, è possibile accedere a un membro Shared tramite la variabile dell'oggetto.

Differenze tra classi e moduli

La differenza principale tra classi e moduli consiste nella possibilità di creare istanze delle classi come oggetti, che non esiste per i moduli standard. Poiché è presente una sola copia di dati di un modulo standard, quando una variabile pubblica viene modificata in un modulo standard da una parte del programma tutte le altre parti del programma ricevono lo stesso valore, per l'eventualità che la variabile venga letta successivamente. I dati degli oggetti, invece, sono separati per ciascun oggetto per il quale sia stata creata un'istanza. A differenza dei moduli standard inoltre le classi possono implementare interfacce.

Nota

Quando si applica un modificatore Shared a un membro di classe, il modificatore viene associato alla classe stessa piuttosto che a una particolare istanza della classe. L'accesso al membro avviene direttamente tramite il nome della classe, nello stesso modo in cui si accede ai membri del modulo.

Le classi e i moduli utilizzano inoltre ambiti diversi per i rispettivi membri. I membri definiti in una classe vengono inseriti in un ambito limitato a una specifica istanza della classe ed esistono solo per la durata dell'oggetto. Per accedere ai membri di una classe dall'esterno di una classe, è necessario utilizzare nomi completi nel formato Object.Member.

D'altra parte, i membri dichiarati all'interno di un modulo hanno accesso pubblico per impostazione predefinita e ad essi può accedere qualsiasi codice che abbia accesso al modulo. Le variabili presenti in un modulo standard sono quindi effettivamente variabili globali, in quanto sono visibili da qualunque punto del progetto ed esistono per la durata del programma.

Riutilizzo di classi e oggetti

Grazie agli oggetti è possibile dichiarare variabili e routine una sola volta e quindi riutilizzarle ogni volta che ve ne sia la necessità. Se, ad esempio, si desidera aggiungere un correttore ortografico a un'applicazione, è possibile definire tutte le variabili e le funzioni di supporto per fornire all'applicazione la funzionalità del correttore ortografico. Se il controllo ortografico viene creato come classe, sarà possibile riutilizzarlo in altre applicazioni aggiungendo un riferimento all'assembly compilato oppure sarà possibile risparmiare lavoro utilizzando la classe di un correttore ortografico già sviluppata da altri programmatori.

In .NET Framework vengono forniti numerosi esempi di componenti disponibili per l'utilizzo. Nell'esempio seguente viene utilizzata la classe TimeZone nello spazio dei nomi System. TimeZone fornisce i membri che consentono di recuperare le informazioni sul fuso orario del computer corrente.

Public Sub examineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
    MsgBox(s)
End Sub

Nell'esempio precedente la prima Istruzione Dim (Visual Basic) dichiara una variabile oggetto di tipo TimeZone e la assegna a un oggetto TimeZone restituito dalla proprietà CurrentTimeZone.

Relazioni tra oggetti

Gli oggetti possono essere posti in relazione tra loro in molti modi. Esistono due tipi principali di relazione, ovvero gerarchica e di contenimento.

Relazione gerarchica

Tra le classi che derivano da altre classi fondamentali e queste ultime esiste una relazione gerarchica. Le gerarchie delle classi sono utili per descrivere gli elementi che sono un sottotipo di una classe più generale.

Nell'esempio riportato di seguito si supponga di voler definire un tipo speciale di classe Button che si comporti come una normale classe Button ma che esponga anche un metodo che consente di invertire i colori di sfondo e di primo piano.

Per definire una classe derivata da una classe già esistente

  1. Utilizzare un'Istruzione Class (Visual Basic) per definire una classe dalla quale creare l'oggetto richiesto.

    Public Class reversibleButton

    Assicurarsi che l'ultima riga di codice nella classe sia seguita da un'istruzione End Class. Per impostazione predefinita, quando si immette un'istruzione Class l'ambiente di sviluppo integrato (IDE) genera automaticamente un'istruzione End Class.

  2. Aggiungere un'Istruzione Inherits subito dopo l'istruzione Class. Specificare la classe dalla quale deriva la nuova classe.

    Inherits System.Windows.Forms.Button

    La nuova classe eredita tutti i membri definiti dalla classe base.

  3. Aggiungere il codice per i membri aggiuntivi esposti dalla classe derivata. Ad esempio, è possibile aggiungere un metodo reverseColors. La classe derivata potrebbe essere simile alla seguente:

    Public Class reversibleButton
        Inherits System.Windows.Forms.Button
        Public Sub reverseColors() 
            Dim saveColor As System.Drawing.Color = Me.BackColor
            Me.BackColor = Me.ForeColor
            Me.ForeColor = saveColor
        End Sub
    End Class 
    

    Se si crea un oggetto dalla classe reversibleButton, tale oggetto potrà accedere a tutti i membri della classe Button, nonché al metodo reverseColors e a qualsiasi altro nuovo membro definito in reversibleButton.

Le classi derivate ereditano i membri della classe su cui sono basate, consentendo di raggiungere una maggiore complessità mano a mano che si avanza nella gerarchia. Per ulteriori informazioni, vedere Nozioni fondamentali sull'ereditarietà (Visual Basic).

Compilazione del codice

Assicurarsi che il compilatore possa accedere alla classe dalla quale si desidera derivare la nuova classe. A tale scopo è possibile fornire il nome completo della classe, come nell'esempio precedente, oppure specificare il relativo spazio dei nomi in un'Istruzione Imports (tipo e spazio dei nomi .NET). Se la classe si trova in un progetto differente, può essere necessario aggiungere un riferimento a tale progetto. Per ulteriori informazioni, vedere Riferimenti a spazi dei nomi e componenti.

Relazione di contenimento

Gli oggetti possono anche avere tra loro una relazione di contenimento. Gli oggetti contenitore incapsulano logicamente altri oggetti. L'oggetto OperatingSystem ad esempio contiene logicamente un oggetto Version, che restituisce tramite la proprietà Version. Tenere presente che l'oggetto contenitore non contiene fisicamente altri oggetti.

Insiemi

Un tipo particolare di contenimento degli oggetti è rappresentato dagli insiemi. Gli insiemi sono gruppi di oggetti simili che possono essere enumerati. Visual Basic supporta una sintassi specifica nell'Istruzione For Each...Next (Visual Basic) che consente di scorrere gli elementi di un insieme. Inoltre, gli insiemi consentono spesso di utilizzare una Item per recuperare gli elementi in base al relativo indice o mediante l'associazione a una stringa univoca. Gli insiemi possono risultare di più semplice utilizzo rispetto alle matrici in quanto consentono di aggiungere o rimuovere elementi senza ricorrere agli indici. Grazie alla loro facilità d'uso spesso vengono utilizzati per memorizzare form e controlli.

Argomenti correlati