Kapselung ist einer der Säulen der objektorientierten Programmierung und wird durch Zugriffsmodifizierer wie Private und Protected erreicht. In den klassischen Versionen von Visual Basic wurden nur die einfachsten Sichtbarkeitsstufen unterstützt, aber mit dem Übergang zu VB.NET erschienen moderne Mechanismen, die denen von C# ähnlich sind.
Die Hauptaufgabe besteht darin, interne Implementierungsdetails vom externen Code zu isolieren, einschließlich anderer Teile des Programms. Typische Fehler sind mit falschen Zugriffslevels verbunden, dem Versuch, auf Felder und Methoden außerhalb des erlaubten Sichtbarkeitsbereichs zuzugreifen, oder einem falschen Verständnis des Verhaltens von Protected und seiner Kombinationen mit anderen Modifizierern.
Es werden folgende Modifizierer unterstützt:
Private — Zugriff nur innerhalb der aktuellen Klasse/ModulsProtected — Zugriff innerhalb der aktuellen Klasse und aller Nachkommen (sogar aus anderen Assemblies)Friend — Zugriff innerhalb einer AssemblyProtected Friend — Zugriff innerhalb von Nachkommen oder innerhalb der AssemblyBeispielcode:
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() 'Kompilierungsfehler ProtectedMethod() 'Ok FriendMethod() 'Ok, wenn in derselben Assembly ProtectedFriendMethod() 'Ok End Sub End Class
Wichtige Merkmale:
Private beschränkt die Sichtbarkeit auf die Grenzen der KlasseProtected funktioniert in allen abgeleiteten Klassen in beliebigen AssembliesProtected Friend kombiniert beide RegelnKann man auf ein private-Feld aus einer abgeleiteten Klasse zugreifen?
Nein, private Mitglieder sind immer nur in der Klasse zugänglich, in der sie deklariert sind. Die abgeleitete Klasse hat keinen Zugriff auf private Mitglieder, auch nicht über Reflection (es sei denn, man verwendet nicht standardmäßige Methoden).
Was ist der Unterschied zwischen Protected und Protected Friend?
Protected — nur von der Klasse und ihren Nachkommen zugänglich, selbst in anderen Assemblies; Protected Friend — zugänglich entweder von abgeleiteten Klassen oder von jedem Code innerhalb derselben Assembly.
Kann man auf eine protected-Methode der Klasse über eine Instanz der Basisklasse zugreifen?
Nein, selbst wenn die protected-Methode öffentlich innerhalb des Nachkommen sichtbar ist, kann sie nicht über eine Instanz der Basisklasse aus externem Code aufgerufen werden. Protected-Methoden sind nur im Körper der Klasse selbst oder des Nachkommen verfügbar.
Ein Entwickler macht zur Vereinfachung von Tests interne Felder public, um direkt aus externem Code oder Unit-Tests darauf zugreifen zu können. Im Laufe der Zeit beginnen andere Aufrufe, diese Felder zu verwenden und sich auf deren interne Struktur zu verlassen.
Vorteile:
Nachteile:
Zugriffsmodifizierer werden klar angewendet, alle Felder sind standardmäßig private, der Zugriff von außen erfolgt nur über Eigenschaften und öffentliche Methoden. Für Testzwecke werden Schnittstellen oder Freundklassen in derselben Assembly verwendet.
Vorteile:
Nachteile: