Condividi tramite


Oggetti e classi in Visual Basic

Un oggetto è una combinazione di codice e dati che possono essere considerati come un'unità. Un oggetto può essere una parte di un'applicazione, ad esempio un controllo o una maschera. Un'intera applicazione può anche essere un oggetto .

Quando si crea un'applicazione in Visual Basic, si lavora costantemente con gli oggetti . È possibile utilizzare oggetti forniti da Visual Basic, ad esempio controlli, moduli e oggetti di accesso ai dati. È anche possibile usare oggetti di altre applicazioni all'interno dell'applicazione Visual Basic. È anche possibile creare oggetti personalizzati e definire proprietà e metodi aggiuntivi per tali oggetti. Gli oggetti agiscono come blocchi predefiniti prefabricati per i programmi, che consentono di scrivere un frammento di codice una volta e riutilizzarlo più volte.

In questo argomento vengono illustrati in dettaglio gli oggetti .

Oggetti e classi

Ogni oggetto in Visual Basic è definito da una classe . Una classe descrive le variabili, le proprietà, le routine e gli eventi di un oggetto . Gli oggetti sono istanze di classi; è possibile creare tutti gli oggetti necessari dopo aver definito una classe.

Per comprendere la relazione tra un oggetto e la sua classe, pensa agli tagliabiscotti e ai biscotti. Lo stampo per biscotti è la classe. Definisce le caratteristiche di ogni cookie, ad esempio dimensioni e forma. La classe viene utilizzata per creare oggetti. Gli oggetti sono i cookie.

È necessario creare un oggetto prima di poter accedere ai relativi membri, ad eccezione Shared dei membri a cui è possibile accedere senza un oggetto della classe .

Creare un oggetto da una classe

  1. Determinare da quale classe si vuole creare un oggetto o definire la propria classe. Per esempio:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Scrivere un'istruzione Dim per creare una variabile a cui è possibile assegnare un'istanza di classe. La variabile deve essere del tipo della classe desiderata.

    Dim nextCustomer As Customer
    
  3. Aggiungere la parola chiave New Operator per inizializzare la variabile in una nuova istanza della classe .

    Dim nextCustomer As New Customer
    
  4. È ora possibile accedere ai membri della classe tramite la variabile dell'oggetto.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Annotazioni

Quando possibile, è necessario dichiarare la variabile come del tipo di classe che si intende assegnare. Questa operazione viene chiamata associazione anticipata. Se non si conosce il tipo di classe in fase di compilazione, è possibile richiamare l'associazione tardiva dichiarando che la variabile sia del tipo di dati Object. Tuttavia, l'associazione tardiva può rallentare le prestazioni e limitare l'accesso ai membri dell'oggetto di runtime. Per altre informazioni, vedere Dichiarazione di variabile oggetto.

Istanze multiple

Gli oggetti appena creati da una classe sono spesso identici tra loro. Una volta esistenti come singoli oggetti, tuttavia, le variabili e le proprietà possono essere modificate indipendentemente dalle altre istanze. Ad esempio, se si aggiungono tre caselle di controllo a un modulo, ogni oggetto casella di controllo è un'istanza della CheckBox classe . I singoli CheckBox oggetti condividono un set comune di caratteristiche e funzionalità (proprietà, variabili, routine ed eventi) definiti dalla classe . Tuttavia, ognuno ha il proprio nome, può essere abilitato e disabilitato separatamente e può essere inserito in un percorso diverso nel modulo.

Membri dell'oggetto

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 costituiscono i relativi membri.

Accesso ai membri

È possibile accedere a un membro di un oggetto specificando, in ordine, il nome della variabile oggetto, un punto (.) e il nome del membro. Nell'esempio seguente viene impostata la Text proprietà di un Label oggetto .

warningLabel.Text = "Data not saved"

Elenco di membri intelliSense

IntelliSense elenca i membri di una classe quando si richiama l'opzione Elenca membri, ad esempio quando si digita un punto (.) come operatore di accesso ai membri. Se si digita il punto dopo il nome di una variabile dichiarata come istanza di tale classe, IntelliSense elenca tutti i membri dell'istanza e nessuno dei membri condivisi. Se si digita il punto dopo il nome stesso della classe, IntelliSense elenca tutti i membri condivisi e nessun membro di istanza. Per altre informazioni, vedere Using IntelliSense.

Campi e proprietà

I campi e le proprietà rappresentano le informazioni archiviate in un oggetto . I valori vengono recuperati e impostati con istruzioni di assegnazione allo stesso modo in cui si recuperano e si impostano le variabili locali in una routine. Nell'esempio seguente viene recuperata la Width proprietà e viene impostata la ForeColor proprietà di un Label oggetto .

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

Si noti che un campo è detto anche variabile membro.

Utilizzare le procedure delle proprietà quando:

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

  • La proprietà ha un set ben definito di valori che devono essere convalidati.

  • L'impostazione del valore causa una modifica percepibile dello stato dell'oggetto, ad esempio una IsVisible proprietà.

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

  • È necessario eseguire un set di passaggi prima che la proprietà possa essere impostata o recuperata.

Usare i campi quando:

  • Il valore è di un tipo che si autovalida. Ad esempio, si verifica un errore o una conversione automatica dei dati se un valore diverso da True o False viene assegnato a una Boolean variabile.

  • Qualsiasi valore nell'intervallo supportato dal tipo di dati è valido. Questo vale per molte proprietà di tipo Single o Double.

  • La proprietà è un String tipo di dati e non esiste alcun vincolo per le dimensioni o il valore della stringa.

  • Per altre informazioni, vedere Procedure di proprietà.

Suggerimento

Mantenere sempre privati i campi non costanti. Quando vuoi renderla pubblica, usa una proprietà invece.

Metodi

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

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

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

Si noti che un metodo è semplicemente una routine esposta da un oggetto .

Per altre informazioni, vedere Procedure.

Avvenimenti

Un evento è un'azione riconosciuta da un oggetto, ad esempio facendo clic sul mouse o premendo un tasto e per cui è possibile scrivere codice per rispondere. Gli eventi possono verificarsi a causa di un'azione dell'utente o di un codice del programma oppure possono essere causati dal sistema. Il codice che segnala un evento viene detto di generare l'evento e il codice che risponde a esso viene detto di gestirlo .

È anche possibile sviluppare eventi personalizzati da generare dagli oggetti e gestirli da altri oggetti. Per altre informazioni, vedere Events.

Membri di istanza e membri condivisi

Quando si crea un oggetto da una classe, il risultato è un'istanza di tale classe. I membri non dichiarati con la parola chiave Shared sono membri dell'istanza, che appartengono esclusivamente a tale istanza specifica. Un membro di un'istanza è indipendente dallo stesso membro in un'altra istanza della stessa classe. Una variabile membro dell'istanza, ad esempio, può avere valori diversi in istanze diverse.

I membri dichiarati con la Shared parola chiave sono membri condivisi, che appartengono alla classe nel suo complesso e non a una particolare istanza. Un membro condiviso esiste una sola volta, indipendentemente dal numero di istanze della relativa classe creata o anche se non si creano istanze. Una variabile membro condivisa, ad esempio, ha un solo valore, disponibile per tutto il codice che può accedere alla classe.

Accesso a membri non condivisi

  1. Assicurarsi che l'oggetto sia stato creato dalla relativa classe e assegnato a una variabile oggetto.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. Nella dichiarazione che accede al membro, segui il nome della variabile oggetto con l'operatore di accesso ai membri () e poi il nome del membro.

    secondForm.Show()
    

Accesso ai membri condivisi

  • Seguire il nome della classe con l'operatore member-access (.) e quindi il nome del membro. È sempre necessario accedere a un Shared membro dell'oggetto direttamente tramite il nome della classe.

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

Differenze tra classi e moduli

La differenza principale tra classi e moduli è che le classi possono essere istanziate come oggetti, mentre i moduli standard non possono. Poiché è presente una sola copia dei dati di un modulo standard, quando una parte del programma modifica una variabile pubblica in un modulo standard, qualsiasi altra parte del programma ottiene lo stesso valore se la legge. Al contrario, i dati dell'oggetto esistono separatamente per ogni oggetto istanziato. Un'altra differenza è che, a differenza dei moduli standard, le classi possono implementare interfacce. Se una classe è contrassegnata con il modificatore MustInherit, non si può creare un'istanza direttamente. Tuttavia, è ancora diverso da un modulo perché può essere ereditato mentre i moduli non possono essere ereditati.

Annotazioni

Quando il Shared modificatore viene applicato a un membro di classe, viene associato alla classe stessa anziché a una particolare istanza della classe . L'accesso al membro viene eseguito direttamente usando il nome della classe, allo stesso modo in cui si accede ai membri del modulo.

Le classi e i moduli usano anche ambiti diversi per i loro membri. I membri definiti all'interno di una classe sono inclusi in un'istanza specifica della classe ed esistono solo per la durata dell'oggetto. Per accedere ai membri della classe dall'esterno di una classe, è necessario usare nomi completi nel formato Object. Membro.

D'altra parte, i membri dichiarati all'interno di un modulo sono accessibili pubblicamente per impostazione predefinita e possono essere accessibili da qualsiasi codice che possa accedere al modulo. Ciò significa che le variabili in un modulo standard sono effettivamente variabili globali perché sono visibili da qualsiasi punto del progetto e esistono per la vita del programma.

Riutilizzo di classi e oggetti

Gli oggetti consentono di dichiarare variabili e procedure una sola volta e quindi riutilizzarle ogni volta che necessario. Ad esempio, se si vuole aggiungere un correttore ortografico a un'applicazione, è possibile definire tutte le variabili e le funzioni di supporto per fornire funzionalità di controllo ortografico. Se si crea il correttore ortografico come classe, è possibile riutilizzarlo in altre applicazioni aggiungendo un riferimento all'assembly compilato. Meglio ancora, potresti essere in grado di risparmiare qualche lavoro usando una classe del correttore ortografico già sviluppata da un altro utente.

.NET offre molti esempi di componenti disponibili per l'uso. Nell'esempio seguente, viene utilizzata la classe TimeZone nello spazio dei nomi System. TimeZone fornisce dei membri che consentono di recuperare informazioni sul fuso orario del sistema informatico 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""."
    Console.WriteLine(s)
End Sub

Nell'esempio precedente, la prima istruzione Dim dichiara una variabile oggetto di tipo TimeZone e la assegna a un TimeZone oggetto restituito dalla CurrentTimeZone proprietà .

Relazioni tra oggetti

Gli oggetti possono essere correlati tra loro in diversi modi. I tipi principali di relazione sono gerarchici e di contenimento.

Relazione gerarchica

Quando le classi sono derivate da classi più fondamentali, si dice che abbiano una relazione gerarchica. Le gerarchie di classi sono utili per descrivere gli elementi che sono un sottotipo di una classe più generale.

Nell'esempio seguente si supponga di voler definire un tipo speciale di Button che agisca come normale Button , ma espone anche un metodo che inverte i colori di primo piano e di sfondo.

Definire una classe derivata da una classe già esistente

  1. Usare un'istruzione class per definire una classe da cui creare l'oggetto necessario.

    Public Class ReversibleButton
    

    Assicurarsi che un'istruzione End Class segua l'ultima riga di codice nella classe. Per impostazione predefinita, l'IDE (Integrated Development Environment) genera automaticamente un oggetto End Class quando si immette un'istruzione Class .

  2. Seguite immediatamente l'istruzione Class con un'istruzione Inherits. Specificare la classe da cui 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 ReverseColors metodo e 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 ReversibleButton classe , può accedere a tutti i membri della Button classe , nonché al ReverseColors metodo e a tutti gli altri nuovi membri definiti in ReversibleButton.

Le classi derivate ereditano membri dalla classe su cui si basano, consentendo di aggiungere complessità mentre si procede in una gerarchia di classi. Per altre informazioni, vedere Nozioni di base sull'ereditarietà.

Compilare il codice

Assicurarsi che il compilatore possa accedere alla classe da cui si intende derivare la nuova classe. Ciò potrebbe significare qualificarne completamente il nome, come nell'esempio precedente, o identificarne lo spazio dei nomi in un'istruzione Imports (spazio dei nomi.NET e tipo). Se la classe si trova in un progetto diverso, potrebbe essere necessario aggiungere un riferimento a tale progetto. Per altre informazioni, vedere Gestione dei riferimenti in un progetto.

Relazione di contenimento

Un altro modo in cui gli oggetti possono essere correlati è una relazione di contenimento. Gli oggetti contenitore incapsulano logicamente altri oggetti. Ad esempio, l'oggetto OperatingSystem contiene logicamente un Version oggetto che restituisce tramite la relativa Version proprietà. Si noti che l'oggetto contenitore non contiene fisicamente altri oggetti.

Collezioni

Un particolare tipo di contenimento di oggetti è rappresentato dalle raccolte. Le raccolte sono gruppi di oggetti simili che possono essere enumerati. Visual Basic supporta una sintassi specifica in For Each...Next che permette di iterare sugli elementi di una raccolta. Inoltre, le raccolte spesso consentono di usare un Item[] per ottenere gli elementi in base all'indice o associandoli a una stringa univoca. Le raccolte possono essere più facili da usare rispetto alle matrici perché consentono di aggiungere o rimuovere elementi senza usare indici. Grazie alla facilità d'uso, le raccolte vengono spesso usate per archiviare moduli e controlli.

Procedura dettagliata: Definizione di classi
Fornisce una descrizione dettagliata di come creare una classe.

Proprietà e metodi sovraccaricati
Proprietà e metodi sovraccaricati

Nozioni di base dell'ereditarietà
Vengono illustrati i modificatori di ereditarietà, l'override di metodi e proprietà, MyClass e MyBase.

Durata degli oggetti: modalità di creazione e eliminazione degli oggetti
Viene descritta la creazione e l'eliminazione di istanze di classe.

Tipi anonimi
Viene descritto come creare e usare tipi anonimi, che consentono di creare oggetti senza scrivere una definizione di classe per il tipo di dati.

Inizializzatori di oggetti: tipi denominati e anonimi
Vengono illustrati gli inizializzatori di oggetto, usati per creare istanze di tipi denominati e anonimi usando una singola espressione.

Procedura: Dedurre nomi e tipi di proprietà nelle dichiarazioni di tipo anonimo
Viene illustrato come dedurre i nomi e i tipi di proprietà nelle dichiarazioni di tipo anonimo. Fornisce esempi di inferenza riuscita e non riuscita.