Casino online











Mercato forex






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:
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 User
            Dim Nick, Email, Password As String
            Dim ID As Int16
        End 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
            ID
        End Enum

        'Dichiarazione di una variabile privata, un arraylist
        'che conterrà struttura User
        Private Users As ArrayList
        'Se non viene specificato altrimenti, un membro si assume Private
        Dim NickHost As String = "Totem"

        'Dichiarazione di una procedura pubblica
        Public Sub ChangeNickHost(ByVal s As String)
            NickHost = s
        End Sub

        'Dichiarazione di una funzione pubblica
        Public Function UserExists(ByVal Nick As String) As Boolean
            'Restituisce vero se un utente già esiste, altrimenti falso
            For i As Byte = 0 To 49
                If Users(i).Nick = Nick Then
                    Return True
                End If
            Next

            Return False
        End Function

        'Dichiarazione di una procedura pubblica, che ha il compito di
        'aggiungere un utente
        Public Sub AddUser(ByVal Nick As String, ByVal Email As String, _
            ByVal Pass As String)
            'Crea una variabile temporanea di tipo User: 
            'questa operazione è corretta poichè la struttura 
            'User appartiene alla classe di questa procedura
            Dim Temp As 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 I As 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 = 0 To Users.Count - 1
                Select Case Mode
                    Case What.Nick
                        If Users(I).Nick = Parameter Then
                            Users.RemoveAt(I)
                            Exit For
                        End If
                    Case What.Email
                        If Users(I).Email = Parameter Then
                            Users.RemoveAt(I)
                            Exit For
                        End If
                    Case What.Password
                        If Users(I).Password = Parameter Then
                            Users.RemoveAt(I)
                            Exit For
                        End If
                    Case What.ID
                        If Users(I).ID = Parameter Then
                            Users.RemoveAt(I)
                            Exit For
                        End If
                End Select
            Next
        End Sub
    End Class

    Sub Main()
        'Nuovo oggetto Utente
        Dim U As New Utente
        Dim N, E, P As 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 
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.


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.