In Visual Basic is het toegangsniveau "protected" (Protected) bedoeld voor encapsulatie - het laat leden van de klasse alleen toegankelijk zijn binnen de klasse zelf en haar afgeleiden. Dit is belangrijk voor de organisatie van OOP-architectuur en voor het beperken van directe toegang tot de interne implementatie van een object.
Historisch gezien was er in klassiek VB6 bijna geen dergelijke flexibiliteit, maar vanaf VB.NET werden volledige toegangsmodificatoren toegevoegd die voldoen aan de moderne OOP-standaarden.
Een fout in het organiseren van toegang kan leiden tot onjuist gebruik van de eigenschappen of methoden van de klasse en, potentieel, tot schending van encapsulatie. Bijvoorbeeld, een openbare methode (Public) is toegankelijk voor iedereen, inclusief externe componenten, terwijl beschermd alleen de toegang voor afgeleiden beperkt.
In VB.NET zijn de modificatoren Protected, Protected Friend en Private beschikbaar. Protected is alleen zichtbaar binnen de klasse en haar afgeleiden, Protected Friend is zichtbaar binnen de assembly en afgeleiden, Private is alleen zichtbaar binnen de klasse waarin het is gedeclareerd.
Voorbeeld code:
Public Class Animal Protected Sub Eat() Console.WriteLine("Eten...") End Sub Private Sub Sleep() Console.WriteLine("Slapen...") End Sub End Class Public Class Dog Inherits Animal Public Sub PerformEat() Eat() ' Toegankelijk: Protected End Sub ' Sleep() niet toegankelijk: Private End Class
Belangrijkste kenmerken:
Kan de modifier Protected de zichtbaarheid van een lid van de klasse voor alle klassen in de assembly waarborgen?
Nee, alleen voor de klasse zelf en haar afgeleiden. Protected Friend - voor de klasse, haar afgeleiden en alle klassen in de assembly.
Is het mogelijk om expliciet aan te geven dat een eigenschap alleen zichtbaar is voor afgeleide klassen buiten de assembly, maar niet binnen de assembly?
Nee, een dergelijk niveau bestaat niet. Protected Friend deelt de zichtbaarheid gelijkmatig tussen afgeleiden en de assembly, maar je kunt deze gebieden niet splitsen.
Als in de basisklasse een methode als Protected is gedefinieerd, kan deze dan als Public in de afgeleide klasse worden overschreven?
Nee, het toegangsniveau kan alleen strikt naar beneden worden gehandhaafd of uitgebreid, maar niet worden ingeperkt; het uitbreiden van de toegang schendt de principes van encapsulatie. In .NET zal de compiler een foutmelding geven bij het proberen de toegang in te perken.
Een startende ontwikkelaar verklaarde interne methoden van de businesslogica als Public. Na enige tijd, bij het updaten van het programma, ontstond er een overvloed aan bugs door ongecontroleerde toegang tot deze methoden door externe componenten.
Voordelen:
Nadelen:
Een ervaren programmeur gebruikt Protected en Private, verdeelt verantwoordelijkheden tussen ouder- en afgeleide klassen. Hierdoor hebben updates geen invloed op externe API's, en is het aantal bugs verminderd.
Voordelen:
Nadelen: