L'incapsulamento è uno dei pilastri della programmazione orientata agli oggetti, raggiunto tramite modificatori di accesso come Private e Protected. Nelle versioni classiche di Visual Basic erano supportati solo i livelli di visibilità più semplici, ma con il passaggio a VB.NET sono apparsi meccanismi moderni, simili a C#.
L'obiettivo principale è isolare i dettagli interni dell'implementazione dal codice esterno, inclusi altri parti del programma. Errori tipici sono legati a livelli di accesso errati, tentativi di accedere a campi e metodi al di fuori dell'area di visibilità consentita o una comprensione errata del comportamento di Protected e delle sue combinazioni con altri modificatori.
Sono supportati i seguenti modificatori:
Private — accesso solo all'interno della classe/modulo correnteProtected — accesso all'interno della classe corrente e di tutte le sue derivate (anche da altre assembly)Friend — accesso all'interno della stessa assemblyProtected Friend — accesso all'interno delle derivate o all'interno della assemblyEsempio di codice:
Public Class BaseClass Private Sub PrivateMethod() Console.WriteLine("PrivateMethod") End Sub Protected Sub ProtectedMethod() Console.WriteLine("ProtectedMethod") End Sub Friend Sub FriendMethod() Console.WriteLine("FriendMethod") End Sub Protected Friend Sub ProtectedFriendMethod() Console.WriteLine("ProtectedFriendMethod") End Sub End Class Public Class DerivedClass Inherits BaseClass Public Sub AccessMethods() 'PrivateMethod() 'Errore di compilazione ProtectedMethod() 'Ok FriendMethod() 'Ok, se nella stessa assembly ProtectedFriendMethod() 'Ok End Sub End Class
Caratteristiche chiave:
Private limita l'area di visibilità ai confini della classeProtected funziona in tutte le classi derivate in qualsiasi assemblyProtected Friend combina entrambe le regoleSi può accedere a un campo private da una classe derivata?
No, i membri private sono sempre accessibili solo nella classe in cui sono dichiarati. La classe derivata non ha accesso ai membri private nemmeno tramite riflessione (a meno che non si utilizzino metodi non standard).
Qual è la differenza tra Protected e Protected Friend?
Protected — accessibile solo dalla classe e dai suoi discendenti, anche in altre assembly; Protected Friend — accessibile o dalle classi derivate o da qualsiasi codice all'interno della stessa assembly.
Si può chiamare un metodo protetto di una classe tramite un'istanza della classe base?
No, anche se il metodo protetto è pubblicamente visibile all'interno del discendente, non può essere chiamato su un'istanza della classe base dal codice esterno. I metodi protetti sono accessibili solo nel corpo della classe stessa o del suo discendente.
Uno sviluppatore per semplificare i test rende i campi interni pubblici per accedervi direttamente dal codice esterno o dai test unitari. Col passare del tempo, altre chiamate iniziano a utilizzare questi campi, facendo affidamento sulla loro struttura interna.
Pro:
Contro:
Vengono applicati chiaramente i modificatori di accesso, tutti i campi sono per impostazione predefinita privati, accesso esterno solo tramite proprietà e metodi pubblici. Per le esigenze di test si utilizzano interfacce o classi amiche nella stessa assembly.
Pro:
Contro: