L'encapsulation est l'un des piliers de la programmation orientée objet, et elle est atteinte grâce à des modificateurs d'accès, tels que Private et Protected. Dans les versions classiques de Visual Basic, seuls les niveaux de visibilité les plus simples étaient supportés, mais avec la transition vers VB.NET, des mécanismes modernes, similaires à ceux de C#, ont fait leur apparition.
L'objectif principal est d'isoler les détails internes de l'implémentation du code externe, y compris des autres parties du programme. Les erreurs typiques sont liées à un niveau d'accès incorrect, à des tentatives d'accès à des champs et à des méthodes en dehors de la portée autorisée ou à une mauvaise compréhension du comportement des modificateurs Protected et de leur combinaison avec d'autres modificateurs.
Les modificateurs suivants sont supportés :
Private — accès uniquement à l'intérieur de la classe/module actuelProtected — accès à l'intérieur de la classe actuelle et de tous les héritiers (même provenant d'autres assemblies)Friend — accès à l'intérieur d'une même assemblyProtected Friend — accès au sein des héritiers ou à l'intérieur de l'assemblyExemple de code :
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() 'Erreur de compilation ProtectedMethod() 'Ok FriendMethod() 'Ok, si dans la même assembly ProtectedFriendMethod() 'Ok End Sub End Class
Caractéristiques clés :
Private limite la portée à celle de la classeProtected fonctionne dans toutes les classes dérivées dans n'importe quelle assemblyProtected Friend combine les deux règlesPeut-on accéder à un champ private depuis une classe dérivée ?
Non, les membres privés sont toujours accessibles uniquement dans la classe où ils sont déclarés. Une classe dérivée n'a pas accès aux membres privés même par réflexion (à moins d'utiliser des méthodes non standard).
Quelle est la différence entre Protected et Protected Friend ?
Protected — accessible uniquement depuis la classe et ses descendants, même dans d'autres assemblies ; Protected Friend — accessible soit depuis des classes dérivées, soit depuis n'importe quel code à l'intérieur de la même assembly.
Peut-on appeler une méthode protégée d'une classe via une instance de la classe de base ?
Non, même si la méthode protégée est visible publiquement dans l'héritier, elle ne peut pas être appelée sur une instance de la classe de base depuis du code externe. Les méthodes protégées ne sont accessibles que dans le corps de la classe elle-même ou de l'héritier.
Un développeur, pour simplifier les tests, rend des champs internes publics afin de les accéder directement depuis du code externe ou des tests unitaires. Avec le temps, d'autres appels commencent à utiliser ces champs, s'appuyant sur leur structure interne.
Avantages :
Inconvénients :
Les modificateurs d'accès sont clairement appliqués, tous les champs sont par défaut privés, l'accès externe n'est possible que via des propriétés et des méthodes publiques. Pour les besoins des tests, des interfaces ou des classes amies dans la même assembly sont utilisées.
Avantages :
Inconvénients :