カプセル化はオブジェクト指向プログラミングの柱の一つであり、PrivateやProtectedといったアクセス修飾子によって達成されます。従来のVisual Basicでは、単純な可視性のレベルしかサポートされていませんでしたが、VB.NETに移行することで、C#に似た現代的なメカニズムが登場しました。
主な課題は、実装の内部詳細を外部コードから隔離することです。典型的なエラーは、誤ったアクセスレベルや許可された可視性の範囲外からフィールドやメソッドにアクセスしようとすること、あるいはProtectedの動作を誤解することに関連しています。
次の修飾子がサポートされます:
Private — 現在のクラス/モジュール内のみアクセス可能Protected — 現在のクラスと全ての派生クラス内でアクセス可能(他のアセンブリからも)Friend — 同一アセンブリ内でアクセス可能Protected Friend — 派生クラスまたは同一アセンブリ内でアクセス可能コード例:
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() 'コンパイルエラー ProtectedMethod() 'OK FriendMethod() 'OK、同一アセンブリ内で ProtectedFriendMethod() 'OK End Sub End Class
主要な特徴:
Private修飾子はクラスの範囲内に視野を制限します。Protectedはすべての派生クラスでどのアセンブリにでも機能します。Protected Friendは両方のルールを結合します。派生クラスからprivateメンバーにアクセスできますか?
いいえ、privateメンバーは常に宣言されたクラス内でのみアクセス可能です。派生クラスはprivateメンバーにアクセスすることはできません(標準的でない方法を使用しない限り)。
ProtectedとProtected Friendはどのように異なりますか?
Protected — クラスとその子孫からのみアクセス可能で、他のアセンブリでもそうです; Protected Friend — 派生クラスまたは同一アセンブリ内の任意のコードからアクセス可能です。
基本クラスのインスタンスを通じてprotectedメソッドにアクセスできますか?
いいえ、protectedメソッドが派生クラス内で公開されていても、外部コードから基本クラスのインスタンスで呼び出すことはできません。Protectedメソッドはそのクラスまたは派生クラスの本体内でのみ利用可能です。
開発者はテストを簡素化するため、内部フィールドをpublicにし、外部コードやUnitテストから直接アクセスできるようにします。時間が経つにつれて、他の呼び出しがこれらのフィールドを内部構造に頼って利用し始めます。
利点:
欠点:
アクセス修飾子が明確に適用され、すべてのフィールドがデフォルトでprivateとされ、外部からのアクセスはプロパティおよび公開メソッドを通じてのみ行われます。テストのニーズには、友達クラスや同一アセンブリ内のインターフェースが使用されます。
利点:
欠点: