Enkapsulacja to jedna z podstaw programowania obiektowego, osiągana dzięki modyfikatorom dostępu, takim jak Private i Protected. W klasycznych wersjach Visual Basic wspierane były tylko najprostsze poziomy widoczności, ale w przejściu na VB.NET pojawiły się nowoczesne mechanizmy, podobne do C#.
Podstawowym zadaniem jest izolacja wewnętrznych szczegółów implementacji od kodu zewnętrznego, w tym z innych części programu. Typowe błędy związane są z niepoprawnym poziomem dostępu, próbami dostępu do pól i metod poza dozwoloną przestrzenią widoczności lub niewłaściwym rozumieniem zachowania Protected i jego kombinacji z innymi modyfikatorami.
Wspierane są następujące modyfikatory:
Private — dostęp tylko wewnątrz bieżącej klasy/modułuProtected — dostęp wewnątrz bieżącej klasy i wszystkich dziedziczących (nawet z innych zestawów)Friend — dostęp wewnątrz jednego zestawuProtected Friend — dostęp wewnątrz dziedziczących lub wewnątrz zestawuPrzykład kodu:
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() 'Błąd kompilacji ProtectedMethod() 'Ok FriendMethod() 'Ok, jeśli w tym samym zestawie ProtectedFriendMethod() 'Ok End Sub End Class
Kluczowe cechy:
Private ogranicza widoczność do granic klasyProtected działają w wszystkich klasach dziedziczących w dowolnych zestawachProtected Friend łączy obie zasadyCzy można uzyskać dostęp do private-pola z klasy pochodnej?
Nie, człony private są zawsze dostępne tylko w klasie, w której zostały zadeklarowane. Klasa pochodna nie ma dostępu do członów private nawet przez refleksję (chyba że użyje niestandardowych sposobów).
Czym różni się Protected od Protected Friend?
Protected — dostępny tylko z klasy i jej potomków, nawet w innych zestawach; Protected Friend — dostępny albo z klas pochodnych, albo z jakiegokolwiek kodu wewnątrz tego samego zestawu.
Czy można odwołać się do protected-metody klasy przez instancję klasy bazowej?
Nie, nawet jeśli protected-metoda jest publicznie widoczna wewnątrz dziedziczącego, nie można jej wywołać na instancji klasy bazowej z kodu zewnętrznego. Metody protected są dostępne tylko w ciele samej klasy lub jej dziedziczącego.
Programista dla uproszczenia testowania czyni wewnętrzne pola publicznymi, aby mieć do nich bezpośredni dostęp z kodu zewnętrznego lub testów jednostkowych. Z biegiem czasu inne wywołania zaczynają używać tych pól, polegając na ich wewnętrznej strukturze.
Zalety:
Wady:
Wyraźnie stosowane są modyfikatory dostępu, wszystkie pola domyślnie są private, dostęp zewnętrzny tylko przez właściwości i publiczne metody. Do potrzeb testowania używane są interfejsy lub klasy-przyjaciele w jednym zestawie.
Zalety:
Wady: