Casino online











Mercato forex






A21. Le classi: sintassi e dichiarazione


Le Classi: cosa sono?
Come abbiamo visto, le strutture sono in grado di contenere numerose variabili di qualsiasi tipo (e come vedremo anche metodi e operatori), sia derivato che complesso. Ebbene le classi sono ad un livello superiore, in quanto possono contenere non solo variabili e costanti, strutture ed enumeratori, procedure e funzioni, costruttori e distruttori (tutti detti membri della classe), ma anche, cosa più importante, ereditare altre classi e implementare interfacce (tutti concetti che saranno spiegati successivamente) ed ogni membro della classe è contraddistinto da un diverso livello di accesso. Tutti sono concetti importantissimi, poichè, essendo il Vb.Net un linguaggio ad oggetti, è fondato sulle classi, chiamate anche, per l'appunto, oggetti. Ora vedremo in dettaglio come si utilizzano queste classi.

Le Classi: sintassi e dichiarazione
La sintassi di una classe è questa:
Class [nome]
  'membri della classe
End Class 
Le classi sono dette anche Oggetti: infatti ogni controllo della windows form (pulsanti, finestre, caselle di testo) è una classe al cui interno ci sono procedure, funzioni, costanti, variabili ecc... Quindi per dichiarare una classe non basta specificarne il nome dopo la parola As, ma bisogna usare un costruttore, ossia una procedura speciale che ha il compito di creare un nuovo oggetto e di svolgere, inoltre, anche altre operazioni che predispongono l'oggetto all'"uso". Il costruttore ha sempre come nome 'New' e può avere un numero qualsiasi di parametri. Quindi per utilizzare una classe si usa uno di questi due costrutti:
Dim [nome] As New [classe]([parametri del costruttore]) 
oppure:
Dim [nome] As [classe]
[nome] = New [classe]([parametri costruttore]) 
È molto importante capire la sottile differenza tra classe e oggetto: spesso si utilizza lo stesso nome per entrambi, non a torto, tuttavia la classe è, come dire, la struttura base che accomuna variabili dello stesso tipo, mentre un oggetto è un'istanza di tale classe. Per chiarire meglio questi concetti è bene fare un esempio: tutti noi sappiamo di essere umani, tuttavia non siamo tutti uguali. L'"essere umano", come entità astratta è qualcosa che non esiste ma tutti sappiamo riconoscere un uomo da una pianta, quindi è ciò che sta alla base del concetto stesso di uomo e lo possiamo assimilare alla classe Essere_Umano. Tuttavia non esiste un solo umano sulla terra, ma siamo svariati miliardi di individui, tutti diversi e ognuno in possesso di caratteristiche uniche che lo contraddistinguono dagli altri: ebbene si può assimilare ogni uomo, come lo sono io e come lo siete voi, a un oggetto, più precisamente a un'istanza (ossia una copia) della classe Essere_Umano.
Un esempio:
Module Module1
    'Classe
    Class Calcolatrice
        'In questa classe non viene specificato nessun costruttore, 
        perciò si assume
        'che esista un costrutture senza parametri che inizializzi 
        'l'oggetto e basta
        Function Somma(ByVal a As Double, ByVal b As Double) As Double
            Return a + b
        End Function
        
        Function Prodotto(ByVal a As Double, ByVal b As Double) As Double
            Return a * b
        End Function
        
        Function Quoziente(ByVal a As Double, ByVal b As Double) As Double
            Return a / b
        End Function
        
        Function Radice(ByVal a As Double) As Double
            Return Math.Sqrt(a)
        End Function
        
        Function Quadrato(ByVal a As Double) As Double
            Return a * a
        End Function
        
        Function Cubo(ByVal a As Double) As Double
            Return a * a * a
        End Function
    End Class
    
    Sub Main()
        'Oggetto, istanza della classe Calcolatrice
        Dim Calc As New Calcolatrice
        Dim c As Double

        c = Calc.Somma(1, -2)
        Console.WriteLine(c)

        c = Calc.Prodotto(34.3, 23.908)
        Console.WriteLine(c)

        c = Calc.Cubo(Calc.Radice(49))
        Console.WriteLine(c)

        Console.ReadKey()
    End Sub
End Module 
In questo esempio abbiamo dichiarato una classe Calcolatrice, nella quale sono specificate diverse funzioni che eseguono alcune operazioni aritmetiche fra numeri dati: naturalmente l'esempio è molto semplice, ma serve per rendere l'idea. Ogni funzione scritta all'interno di Calcolatrice è una funzione membro, accessibile tramite l'operatore '.' (come nelle strutture). Abbiamo quindi dichiarato una variabile di tipo Calcolatrice, ma l'abbiamo fatto usando il costruttore New: se non si usasse New risulterebbe a run-time (ossia mentre il programma è in esecuzione) un errore che porta la seguente dicitura: 'Object reference not set to an instance of an object', ossia 'Riferimento ad un oggetto non impostato su istanza di oggettò. Significa che abbiamo fatto riferimento, se non avessimo specificato il costruttore New prima del nome della classe, ad un oggetto che non esiste, che non ha istanze materiali nella memoria. Quindi è essenziale ricordarsi sempre di usare New per dichiarare oggetti che devono essere utilizzati. Ora vediamo un esempio in cui viene specificato il costruttore:
Module Module1
    Class Calcolatrice
        Dim a, b As Double 'Variabili membro della classe
        
        Sub New(ByVal valore_iniziale_a As Double, _ 
            ByVal valore_iniziale_b As Double)
            a = valore_iniziale_a
            b = valore_iniziale_b
        End Sub
        
        Function Somma() As Double
            Return a + b
        End Function
        
        Function Prodotto() As Double
            Return a * b
        End Function
        
        Function Quoziente() As Double
            Return a / b
        End Function
        
        Function Radice() As Double
            Return Math.Sqrt(a)
        End Function
        
        Function Quadrato() As Double
            Return a * a
        End Function
        
        Function Cubo() As Double
            Return a * a * a
        End Function
        
        Sub SetA(ByVal Num As Double)
            a = Num
        End Sub
        
        Sub SetB(ByVal Num As Double)
            b = Num
        End Sub
    End Class
    
    Sub Main()
        Dim Calc As New Calcolatrice(1, 1.908)
        Dim c As Double

        c = Calc.Somma()
        Console.WriteLine(c)

        Calc.SetA(2)
        Calc.SetB(4)

        c = Calc.Prodotto * Calc.Radice - Calc.Somma
        Console.WriteLine(c)

        Console.ReadKey()
    End Sub
End Module 
In questo esempio abbiamo sempre la classe Calcolatrice, dove, però, sono state apportate alcune modifiche: per prima cosa è stato dichiarato il costruttore New che accetta due parametri e, oltre ad inizializzare l'oggetto, assegna il primo parametro come valore ad a ed il secondo a b, entrambe variabili membro della classe. Come si vede nella dichiarazione, dopo il nome della classe c'è una parentesi in cui sono specificati i parametri del costruttore (che, anche se può sembrare strano, non vanno specificati dopo la parola New come per le normali procedure). Inoltre sono state aggiunte due procedure per impostare i valori di a e di b, sui quali si basano tutte le funzioni della classe.


Campi e membri
Come per classe e oggetto, anche campo e membro sono concetti differenti. Tutto ciò che sta all'interno di una classe viene definito membro della classe, quindi sono considerati membri anche metodi, costruttori, distruttori, eventi ed eventuali altre classi nidificate. Il campo è un membro, come se fosse un suo sottoinsieme, ma vengono chiamati campi solo quei membri che sono in grado di assumere un valore. Questo sarà particolarmente importante nelle operazioni di serializzazione e deserializzazione che vedremo in seguito. Questo esempio contiene anche argomenti che non sono ancora stati analizzati, ma di cui apprezzerete in seguito l'utilità:
Class Esempio
    'Questi due sono campi:
    Dim A, B As Int32
    Dim S As String
    
    'Anche questo è un campo
    Property A_Value() As String
        Get
            Return A
        End Get
        Set(ByVal Value As String)
            A = Value
        End Set
    End Property
    
    'Questi quattro sono membri:
    Sub Multiply()
        A *= B
    End Sub
    
    Function Power() As Double
        Return Math.Pow(A, B)
    End Sub
    
    Sub New()
        A = 1
        B = 1
        S = "Ciao"
    End Sub
    
    Sub Finalize()
        A = 0
        B = 0
        S = Nothing
    End Sub
    
    'Questo è un altro membro
    Class Esempio_Nidificato
        '...
    End Class
End Class 


Classi Partial
Le classi Partial sono comunissime classi il cui corpo, però, viene scritto in due file sorgenti diversi. Questo può essere utile per separare logicamente parti del codice che hanno ambiti di competenza diversi, oppure semplicemente per migliorarne la leggibilità. Faccio un piccolo esempio pratico in cui mi riferisco all'editor visuale del compilatore che useremo tra un pò. Quando si trascina un controllo come, ad esempio, un pulsante, una lista o una casella di testo sulla superficie della finestra, il compilatore genera automaticamente un codice che definisce le propriet� di ogni controllo: dimensione, posizione, colore, nome, carattere, eccetera. Tuttavia se si guarda nella finestra del codice si vede una schermata bianca, o quasi. Il codice "nascosto" è semplicemente definito in un altro file, con estensione *.designer.vb, poichè la finestra (o, con un termine più tecnico, la Windows Form) non è altro che una classe Partial, di cui una parte, ossia il codice che scriviamo noi è in un file, e l'altra, il codice di design che genera il compilatore, in un altro file.
Una classe Partial viene dichiarata in questo modo:
'Codice nel file 1
Partial Classe [Nome]
  '...
End Class

'Codice nel file 2 e seguenti
Class [Nome]
  '...
End Class 
Come si vede, basta una sola parte della classe definita Partial: le altre verranno assemblate insieme dal compilatore. Una cosa molto importante, che sarà chiara in seguito: una classe Partial è pur sempre una e una sola classe, e quindi può ereditare solamente una classe base.






 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.