programming/vb.net/accessibility/index.wiki.txt

current previous
15,9 15,7
 
#adunit
#adunit
 

        

        
 
*アクセス修飾子とアクセシビリティ
*アクセス修飾子とアクセシビリティ
~
アクセシビリティを指定するためのものが''アクセス修飾子''で、``Public``や``Private``などのキーワードがアクセス修飾子にあたります。
アクセシビリティを指定するためのものがアクセス修飾子で、PublicやPrivateなどのキーワードがアクセス修飾子にあたります。 例えば次のようなクラスにおいて、Method1はアクセス修飾子Publicが指定されているためクラス外からも呼び出すことができますが、Method2はPrivateであるためクラス外からは呼び出せず、同一クラス内からのみ呼び出せます。
+

         
+
例えば次のようなクラスにおいて、``Method1``はアクセス修飾子``Public``が指定されているためクラス外からも呼び出すことができますが、``Method2``は``Private``であるためクラス外からは呼び出せず、同一クラス内からのみ呼び出せます。
 

        

        
 
#code(vb){{
#code(vb){{
 
Class Sample
Class Sample
33,63 31,34
 
End Class
End Class
 
}}
}}
 

        

        
~
``Public``や``Private``以外にも、アクセス範囲を限定するための様々なアクセス修飾子があります。 アクセス修飾子の種類とその概要は次のとおりです。
PublicやPrivate以外にも、アクセス範囲を限定するための様々なアクセス修飾子があります。 アクセス修飾子の種類とその概要は次のとおりです。
 

        

        
 
|*アクセス修飾子のアクセシビリティ
|*アクセス修飾子のアクセシビリティ
 
|~アクセス修飾子|~適用されるアクセシビリティ|~詳細|h
|~アクセス修飾子|~適用されるアクセシビリティ|~詳細|h
~
|~``Public``|すべての箇所からのアクセスを許可|{{
|~Public|すべての箇所からのアクセスを許可|{{
 
同じプロジェクト内・他のプロジェクトのすべての箇所からのアクセスが可能とするように公開する
同じプロジェクト内・他のプロジェクトのすべての箇所からのアクセスが可能とするように公開する
 
}}|
}}|
~
|~``Friend``|プロジェクト内からのアクセスのみ許可|{{
|~Friend|プロジェクト内からのアクセスのみ許可|{{
 
同じプロジェクト内からのアクセスは可能とするが、他のプロジェクトからのアクセスは不可能とするように公開する
同じプロジェクト内からのアクセスは可能とするが、他のプロジェクトからのアクセスは不可能とするように公開する
~

         
(同じプロジェクト内からのアクセスに対してはPublic、他のプロジェクトからのアクセスに対してはPrivateとなる)
+
(同じプロジェクト内からのアクセスに対しては``Public``相当、他のプロジェクトからのアクセスに対しては``Private``相当となる)
 
}}|
}}|
~
|~``Protected``|クラス内、または派生クラスからのアクセスのみ許可|{{
|~Protected|クラス内、または派生クラスからのアクセスのみ許可|{{
~
同じクラス内、および派生クラスからのアクセスは可能とするが、クラス外および継承関係にないクラスからのアクセスは不可能とするように公開する
同じクラス内および派生クラスからのアクセスは可能とするが、クラス外および継承関係にないクラスからのアクセスは不可能とするように公開する
+
}}|
+
|~``Private Protected``&br;(VB 15.5以降)|クラス内、またはプロジェクト内の派生クラスからのアクセスのみ許可|{{
+
同じクラス内、および同じプロジェクト内の派生クラスからのアクセスは可能とするが、クラス外および継承関係にないクラスや、他のプロジェクトで派生しているクラスからのアクセスは不可能とする
+

         
+
(同じプロジェクト内からのアクセスに対しては``Protected``相当、他のプロジェクトからのアクセスに対しては``Private``相当となる)
 
}}|
}}|
~
|~``Protected Friend``|プロジェクト内、クラス内、または派生クラスからのアクセスのみ許可|{{
|~Protected Friend|プロジェクト内、クラス内、または派生クラスからのアクセスのみ許可|{{
~
同じクラス内、および派生クラス、同じプロジェクト内からのアクセスは可能とするが、他のプロジェクトおよび他のプロジェクトで宣言される派生クラスからのアクセスは不可能とするように公開する
同じクラス内および派生クラス、同じプロジェクト内からのアクセスは可能とするが、他のプロジェクトおよび他のプロジェクトで宣言される派生クラスからのアクセスは不可能とするように公開する
~

         
(同じプロジェクト内からのアクセスに対してはPublic、他のプロジェクトからのアクセスに対してはProtectedとなる)
+
(同じプロジェクト内からのアクセスに対しては``Public``相当、他のプロジェクトからのアクセスに対しては``Protected``相当となる)
 
}}|
}}|
~
|~``Private``|クラス内からのアクセスのみ許可|{{
|~Private|クラス内からのアクセスのみ許可|{{
 
同じクラス内からのアクセスは可能とするが、派生クラスやクラス外からのアクセスは不可能とする
同じクラス内からのアクセスは可能とするが、派生クラスやクラス外からのアクセスは不可能とする
+

         
 
(クラス外には一切公開しない)
(クラス外には一切公開しない)
 
}}|
}}|
 

        

        
~
``Protected``, ``Protected Friend``, ``Private Protected``は、継承に関わるアクセス修飾子であるため、クラスのメンバに対してのみ適用可能です。 それ以外のアクセス修飾子は、クラス以外のメンバに対しても適用可能です。 詳しくは[[#accessibility_targets]]でも解説します。
アクセス修飾子にFriendが設定されているメンバは、同じプロジェクト内(厳密には同じ''アセンブリ'')からのアクセスに対してはPublicと同様にすべての箇所からアクセスすることができますが、他のプロジェクトからはPrivateと同様に一切アクセスすることはできません。 [[クラスライブラリ>programming/netfx/classlibrary]]を作成する際、クラスライブラリ内からのアクセスは許可したいが、クラスライブラリの利用者にはアクセスを許可しないメソッドを作りたい、といった場面でアクセス修飾子Friend(およびProtected Friend)を使うことができます。
+

         
+

         
+

         
+
アクセス修飾子とアクセス箇所ごとのアクセス可否をマトリクスにすると次のようになります。
+

         
+
|*アクセス修飾子とアクセス可否の関係
+
|>|~アクセス箇所|>|>|>|>|>|~アクセス修飾子|h
+
|>|~|``Public``|``Protected Friend``|``Friend``|``Protected``|``Private Protected``|``Private``|h
+
|>|同じクラス内から|○|○|○|○|○|○|
+
|同じプロジェクト内の|派生クラスから|○|○|○|○|○|×|
+
|~|クラス外から|○|○|○|×|×|×|
+
|他プロジェクトの|派生クラスから|○|○|×|○|×|×|
+
|~|クラス外から|○|×|×|×|×|×|
+

         
+
アクセス修飾子に``Friend``が設定されているメンバは、同じプロジェクト内(厳密には同じ''アセンブリ'')からのアクセスに対しては``Public``と同様にすべての箇所からアクセスすることができますが、他のプロジェクトからは``Private``と同様に一切アクセスすることはできません。
+

         
+
``Friend``は''同じプロジェクト内のみ可''、``Protected``は''派生クラスのみ可''となることを踏まえた上で、``Protected Friend``は「``Friend``''または''``Protected``の意」つまり「''同じプロジェクト内または派生クラスから''であれば可」、``Private Protected``は「``Friend``''かつ''``Protected``の意」つまり「''同じプロジェクト内かつ派生クラスから''のみ可」と捉えると、アクセス可否の範囲がわかりやすくなります。
+

         
+

         
+

         
+
アクセス修飾子の選択例として[[クラスライブラリ>programming/netfx/classlibrary]]を作成する場合を考えると、クラスライブラリ内からのアクセスは許可したいが、クラスライブラリの利用者にはアクセスを許可しないメソッドを作りたい、といった場面ではアクセス修飾子``Friend``(および``Protected Friend``)を使うことができます。 ``Private Protected``も同様で、クラスライブラリ内での派生クラスからはアクセスを許可したいが、クラスライブラリの利用者には許可しない、といった場面に用いることができます。
 

        

        
 
具体例については後述する[[FriendとProtected Friendの例>#Friend_ProtectedFriend]]、[[型をPrivate・Protectedにする例>#AccessibilityOfNestedType]]もあわせてご覧ください。
具体例については後述する[[FriendとProtected Friendの例>#Friend_ProtectedFriend]]、[[型をPrivate・Protectedにする例>#AccessibilityOfNestedType]]もあわせてご覧ください。
 

        

        
~
*アクセス修飾子を適用できる対象 [#accessibility_targets]
*アクセス修飾子を適用できる対象
 
アクセス修飾子は、クラスやメソッドだけでなくメンバ変数やプロパティ、構造体などにも指定することができます。 ただし、すべてのアクセス修飾子をすべての要素に指定できるわけではなく、対象によっては指定できないアクセス修飾子もあります。
アクセス修飾子は、クラスやメソッドだけでなくメンバ変数やプロパティ、構造体などにも指定することができます。 ただし、すべてのアクセス修飾子をすべての要素に指定できるわけではなく、対象によっては指定できないアクセス修飾子もあります。
 

        

        
 
次の表は、各アクセス修飾子とそのアクセス範囲、アクセス修飾子を適用できる要素をまとめたものです。
次の表は、各アクセス修飾子とそのアクセス範囲、アクセス修飾子を適用できる要素をまとめたものです。
97,15 66,14
 
|*アクセス修飾子を適用できる対象
|*アクセス修飾子を適用できる対象
 
|~アクセス修飾子|>|>|>|>|>|>|~適用できる対象|h
|~アクセス修飾子|>|>|>|>|>|>|~適用できる対象|h
 
|~|~クラス|~構造体|~モジュール|~クラスメンバ|~構造体メンバ|~モジュールメンバ|~ローカル変数|h
|~|~クラス|~構造体|~モジュール|~クラスメンバ|~構造体メンバ|~モジュールメンバ|~ローカル変数|h
~
|~``Public``|CENTER:○|CENTER:○|CENTER:○|CENTER:○|CENTER:''◎''|CENTER:○||
|~Public|CENTER:○|CENTER:○|CENTER:○|CENTER:○|CENTER:◎|CENTER:○||
~
|~``Friend``|CENTER:''◎''|CENTER:''◎''|CENTER:''◎''|CENTER:○|CENTER:○|CENTER:○||
|~Friend|CENTER:◎|CENTER:◎|CENTER:◎|CENTER:○|CENTER:○|CENTER:○||
~
|~``Protected``||||CENTER:○||||
|~Protected||||CENTER:○||||
~
|~``Private Protected``&br;(VB 15.5以降)||||CENTER:○||||
|~Protected Friend||||CENTER:○||||
~
|~``Protected Friend``||||CENTER:○||||
|~Private|CENTER:○|CENTER:○|CENTER:○|CENTER:◎|CENTER:○|CENTER:◎||
~
|~``Private``|CENTER:○|CENTER:○|CENTER:○|CENTER:''◎''|CENTER:○|CENTER:''◎''||
|~Dim||||CENTER:○|CENTER:○|CENTER:○|CENTER:○|
~
|~``Dim``||||CENTER:○|CENTER:○|CENTER:○|CENTER:○|

         
~

         
表中の◎はアクセス修飾子を指定しなかった場合のデフォルトのアクセシビリティです。 例えば構造体ではメソッドにアクセス修飾子を指定しなかった場合はPublicとして扱われますが、クラスではメソッドにアクセス修飾子を指定しなかった場合はPrivateとして扱われます。
+
表中の''◎''はアクセス修飾子を指定しなかった場合の''デフォルトのアクセシビリティ''です。 例えば構造体ではメソッドにアクセス修飾子を指定しなかった場合は``Public``として扱われますが、クラスではメソッドにアクセス修飾子を指定しなかった場合は``Private``として扱われます。
 

        

        
 
Dimは[[ローカル変数の宣言>programming/vb.net/local_variable_declaration]]だけでなくクラス・構造体のメンバ変数を宣言する際にも指定することができます。 Dim自体はアクセス修飾子ではありませんが、Dimを使って宣言されたメンバ変数のアクセシビリティはデフォルトと同じ、つまり構造体ではPublic、クラス・モジュールではPrivateで宣言されているのと同じものとして扱われます。
Dimは[[ローカル変数の宣言>programming/vb.net/local_variable_declaration]]だけでなくクラス・構造体のメンバ変数を宣言する際にも指定することができます。 Dim自体はアクセス修飾子ではありませんが、Dimを使って宣言されたメンバ変数のアクセシビリティはデフォルトと同じ、つまり構造体ではPublic、クラス・モジュールではPrivateで宣言されているのと同じものとして扱われます。