アクセシビリティ

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

アクセシビリティとは

 アクセシビリティとはローカル変数、フィールド(クラス・構造体のメンバ変数)、クラス、モジュールなどを宣言するときに使用するアクセス権のことで、その要素を使用したり参照したりすることをどれだけ認めるかを指定するためのものがPublicやPrivateなどのキーワードです。 次の表は、各アクセス修飾子とその概要、適用できる要素をまとめたものです。
アクセス修飾子の概要
アクセス修飾子 適用した場合のアクセシビリティ 適用できる対象
名前空間 クラス 構造体 モジュール クラス メンバ 構造体メンバ モジュール メンバ ローカル変数
Public  同じプロジェクト、他のプロジェクトからのアクセスが可能。 ×
Protected  同じクラス、そのクラスの派生クラスからのアクセスのみ可能。 × × × × × × ×
Friend  同じプロジェクトからのアクセスのみ可能。 ×
Protected Friend  同じプロジェクト、同じクラス、派生クラスのいずれからもアクセス可能。 × × × × × × ×
Private  同じモジュール、クラス、または構造体からのみアクセス可能。 × ×
Dim  アクセス修飾子ではないが、フィールド・変数の宣言の際に使用できる。 カッコ内はDim宣言した場合のアクセシビリティ。 × × × ×
(Private)

(Public)

(Private)

(Private)
 この表で、赤くなっている部分はアクセス指定子を指定しなかった場合の既定値です。 つまり、名前空間・クラス・構造体・モジュールはアクセス指定子を指定しない場合、既定でFriendになります。

アクセス指定子の適用例

 次のサンプルはアクセス指定子の適用例を、クラスを中心に記述したものです。 詳細はコメントにあるとおりです。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
Class SampleClass

    ' このフィールドはこのクラス内でのみ有効
    Dim dimField As Integer

    ' このフィールドはこのクラス内でのみ有効
    Private privateField As Integer

    ' このフィールドはこのクラス内と派生クラスでのみ有効
    Protected protectedField As Integer

    ' このフィールドはこのクラスの内外で有効
    Public publicField As Integer


    ' このメソッドはこのクラス内でのみ有効です
    Private Sub PrivateMethod()
    End Sub

    ' このメソッドはこのクラス内と派生クラスでのみ有効
    Protected Sub ProtectedMethod()
    End Sub

    ' このメソッドはこのクラスの内外で有効です
    Public Sub PublicMethod()
    End Sub

End Class

Class DerivedClass

    ' SampleClassを継承します
    Inherits SampleClass

    Sub SampleMethod()

        ' これらのフィールドにはアクセス可能
        protectedField = 0
        publicField = 0

        ' これらのメソッドにはアクセス可能
        ProtectedMethod()
        PublicMethod()

    End Sub

End Class


Module MainModule

    Sub Main()

        Dim x As New SampleClass()

        ' このフィールドにはアクセス可能
        x.publicField = 0

        ' このメソッドにはアクセス可能
        x.PublicMethod()

    End Sub

End Module