Encapsulatie is een van de pijlers van objectgeoriënteerd programmeren en wordt bereikt met toegangsmacros zoals Private en Protected. In de klassieke versies van Visual Basic werden alleen de eenvoudigste niveaus van zichtbaarheid ondersteund, maar met de overstap naar VB.NET zijn moderne mechanismen geïntroduceerd, vergelijkbaar met C#.
De belangrijkste taak is om de interne details van de implementatie af te schermen van externe code, inclusief andere delen van het programma. Typische fouten zijn gerelateerd aan onjuiste toegangs niveaus, pogingen om toegang te krijgen tot velden en methoden buiten het toegestane zichtbaarheid gebied of onjuist begrip van het gedrag van Protected en de combinaties met andere toegangsmacros.
De volgende toegangsmacros worden ondersteund:
Private — toegang alleen binnen de huidige klasse/moduleProtected — toegang binnen de huidige klasse en alle afgeleiden klassen (zelfs uit andere assemblies)Friend — toegang binnen één assemblyProtected Friend — toegang binnen afgeleiden klassen of binnen de assemblyVoorbeeldcode:
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() 'Compilatiefout ProtectedMethod() 'Ok FriendMethod() 'Ok, als binnen dezelfde assembly ProtectedFriendMethod() 'Ok End Sub End Class
Belangrijke kenmerken:
Private beperkt de zichtbaarheid tot binnen de klasseProtected werkt in alle afgeleide klassen in elke assemblyProtected Friend combineert beide regelsKun je toegang krijgen tot een private veld vanuit een afgeleide klasse?
Nee, private leden zijn altijd alleen toegankelijk in de klasse waarin ze zijn gedeclareerd. Een afgeleide klasse heeft geen toegang tot private leden, zelfs niet via reflectie (tenzij niet-standaard methoden worden gebruikt).
Wat is het verschil tussen Protected en Protected Friend?
Protected — toegankelijk alleen vanuit de klasse en zijn nakomelingen, zelfs in andere assemblies; Protected Friend — toegankelijk vanuit afgeleide klassen of vanuit enige code binnen dezelfde assembly.
Kun je een protected methode van een klasse aanroepen via een instantie van de basis klasse?
Nee, zelfs als de protected methode publiek zichtbaar is binnen de erfgenaam, kan deze niet worden aangeroepen op een instantie van de basis klasse vanuit externe code. Protected-methoden zijn alleen toegankelijk binnen de body van de eigen klasse of erfgenaam.
Een ontwikkelaar maakt interne velden public om directe toegang vanuit externe code of unit-tests te vereenvoudigen. Na verloop van tijd beginnen andere oproepen deze velden te gebruiken, vertrouwend op hun interne structuur.
Voordelen:
Nadelen:
Toegangsmacro's worden duidelijk toegepast, alle velden zijn standaard private, toegang van buitenaf alleen via eigenschappen en publieke methoden. Voor testdoeleinden worden interfaces of vriendklassen in dezelfde assembly gebruikt.
Voordelen:
Nadelen: