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:
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:Class [nome]' membri della classe End Class
oppure:Dim [nome]As New [classe]([parametri del 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.Dim [nome]As [classe] [nome] =New [classe]([parametri costruttore])
Un esempio:
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'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 aAs Double ,ByVal bAs Double )As Double Return a + bEnd Function Function Prodotto(ByVal aAs Double ,ByVal bAs Double )As Double Return a * bEnd Function Function Quoziente(ByVal aAs Double ,ByVal bAs Double )As Double Return a / bEnd Function Function Radice(ByVal aAs Double )As Double Return Math.Sqrt(a)End Function Function Quadrato(ByVal aAs Double )As Double Return a * aEnd Function Function Cubo(ByVal aAs Double )As Double Return a * a * aEnd Function End Class Sub Main()'Oggetto, istanza della classe Calcolatrice Dim CalcAs New CalcolatriceDim cAs 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 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.Module Module1Class CalcolatriceDim a, bAs Double 'Variabili membro della classe Sub New (ByVal valore_iniziale_aAs Double , _ByVal valore_iniziale_bAs Double ) a = valore_iniziale_a b = valore_iniziale_bEnd Sub Function Somma()As Double Return a + bEnd Function Function Prodotto()As Double Return a * bEnd Function Function Quoziente()As Double Return a / bEnd Function Function Radice()As Double Return Math.Sqrt(a)End Function Function Quadrato()As Double Return a * aEnd Function Function Cubo()As Double Return a * a * aEnd Function Sub SetA(ByVal NumAs Double ) a = NumEnd Sub Sub SetB(ByVal NumAs Double ) b = NumEnd Sub End Class Sub Main()Dim CalcAs New Calcolatrice(1, 1.908)Dim cAs 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
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, BAs Int32Dim SAs String 'Anche questo è un campo Property A_Value()As String Get Return AEnd Get Set (ByVal ValueAs String ) A = ValueEnd Set End Property 'Questi quattro sono membri: Sub Multiply() A *= BEnd 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 = NothingEnd 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:
'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.Codice nel file 1 Partial Classe [Nome] '... End Class 'Codice nel file 2 e seguenti Class [Nome] '... End Class
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



