A22. Le classi: specificatori di accesso
Come abbiamo accennato nella lezione precedente, esistono nell'ambito delle classi degli specificatori di accesso ad un membro:
essi stabiliscono quali parti del programma e della classe possono accedere a tali membri. Infatti ci sono cinque tipi di specificatori di
accesso, tra cui i più usati sono: Private, Public e Protected (che vedremo nella lezione sull'ereditarieta'). Un membro dichiarato PRIVATE è accessibile solo
ed esclusivamente da un membro della stessa sua classe, mentre un membro dichiarato PUBLIC è accessibile da qualunque parte di
un programma (o di una libreria, vedi oltre) anche esterna alla classe. Queste parole riservate vengono utilizzate per limitare l'accesso e
la modifica di dati importanti per una classe. Un esempio per chiarire meglio l'agomento:
Con questo esempio ampiamente commentato spero di essere stato abbastanza chiaro. Tutti i membri di una classe, quindi, ed anche le classi stesse possono avere degli specificatori di accesso, da scrivere sempre prima della parola riservata che dichiara il membro, con una sola eccezione: per le variabili, gli specificatori sostituiscono la parola 'Dim', che viene quindi omessa.Module Module1 'Anche una classe può essere Public, Private o Protected 'In questo caso solo i membri del modulo/namespace/classe 'la possono usare Private Class Utente 'Dichiarazione di una strutture privata Private Structure UserDim Nick, Email, PasswordAs String Dim IDAs Int16End Structure 'Dichiarazione di un enumeratore pubblico 'Questo Enumeratore servirà nella procedura RemoveUser per sapere 'in base a quale criterio verranno confrontati di campi 'dell'utente per l'eliminazione Public Enum What Nick Email Password IDEnd Enum 'Dichiarazione di una variabile privata, un arraylist 'che conterrà struttura User Private UsersAs ArrayList 'Se non viene specificato altrimenti, un membro si assume Private Dim NickHostAs String = "Totem" 'Dichiarazione di una procedura pubblica Public Sub ChangeNickHost(ByVal sAs String ) NickHost = sEnd Sub 'Dichiarazione di una funzione pubblica Public Function UserExists(ByVal NickAs String )As Boolean 'Restituisce vero se un utente già esiste, altrimenti falso For iAs Byte = 0To 49If Users(i).Nick = NickThen Return TrueEnd If Next Return FalseEnd Function 'Dichiarazione di una procedura pubblica, che ha il compito di 'aggiungere un utente Public Sub AddUser(ByVal NickAs String ,ByVal EmailAs String , _ByVal PassAs String ) 'Crea una variabile temporanea di tipo User: 'questa operazione è corretta poichè la struttura 'User appartiene alla classe di questa procedura Dim TempAs User Temp.Nick = Nick Temp.Email = Email Temp.Password = Pass Temp.ID = Users.Count 'Aggiunge la nuova struttura alla collezione Users.Add(Temp)End Sub 'Procedura pubblica che rimuove un utente in base a un criterio 'definito da Mode Public Sub RemoveUser(ByVal Mode As What, ByVal Parameter As String) Dim IAs Int16 'Cicla gli elementi della collezione per vedere se ci sono 'utenti che corrispondono alla descrizione data 'Bisogna notare che questo ciclo rimuove solo il primo utente 'valido incontrato e il motivo è molto semplice: se si 'elimina un elemento di una collezione mentre la si sta 'analizzando, si avrà che il numero di elementi 'è diminuito di uno e quindi si genererà 'un errore quando si tenta di accedere all'indice dichiarato 'nel For che rappresentava solo il numero iniziale di elementi For I = 0To Users.Count - 1Select Case ModeCase What.NickIf Users(I).Nick = ParameterThen Users.RemoveAt(I)Exit For End If Case What.EmailIf Users(I).Email = ParameterThen Users.RemoveAt(I)Exit For End If Case What.PasswordIf Users(I).Password = ParameterThen Users.RemoveAt(I)Exit For End If Case What.IDIf Users(I).ID = ParameterThen Users.RemoveAt(I)Exit For End If End SelectNext End Sub End Class Sub Main() 'Nuovo oggetto Utente Dim UAs New UtenteDim N, E, PAs String 'Questo ciclo permette di aggiungere un qualsiasi numero 'di utenti, dato che è un ciclo inifito: l'unico modo 'per uscirne è non immettere il nickname Do Console.WriteLine("Inserire un Nikcname:") N = Console.ReadLine 'Se N è vuoto, esce dal ciclo If N = ""Then Exit Do End If Console.WriteLine("Inserire l'e-mail:") E = Console.ReadLine Console.WriteLine("Inserire la password:") P = Console.ReadLine U.AddUser(N, E, P) 'Corretto Loop Console.WriteLine("Rimuovere l'utente con il seguente Nickaname:") N = Console.ReadLine 'Notare che bisogna specificare anche la classe di cui 'l'enumeratore è membro U.RemoveUser(Utente.What.Nick, N) U.NickHost = "Ciao" 'Errato: 'la variabile è Private e non è accessibile da fuori della classe! End Sub End Module
Friend
Friend è l'ambito di visibilità predefinito per ogni classe, anche se qualcuno ne è all'oscuro. Questo specificatore di accesso indica al compilatore
che la classe o il membro in questione è visibile da ogni punto dell'assembly corrente. Si è già definito cosa sia un assembly: nella maggior
parte dei casi, l'assembly coincide con il progetto che si sta scrivendo. Ad esempio, se si scrive un'applicazione che si serve di una classe definita
come Friend, essa sarà visibile sempre all'interno del progetto, ma se qualcuno inserisse un riferimento (vedi librerie di classi) a quella
classe al di fuori del progetto non la potrebbe visualizzare.
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



