VB.NET クラスメンバのアクセス修飾子

VB.NETのクラスメンバのアクセス修飾子のサンプルです。

確認環境
・Microsoft Visual Studio Community 2019

目次

説明 クラスメンバのアクセス修飾子
サンプル 確認環境
  メソッドにアクセス修飾子をつけたクラス(Color.vb)
  起動するファイル(vb1.vb)
  別プロジェクトのクラスを使用するクラス(TestClass.vb)

クラスメンバのアクセス修飾子

クラスメンバのアクセス修飾子です。

項目 説明
Public 別のプロジェクトまたは同じプロジェクトからアクセス可能
Friend 同じプロジェクトからアクセス可能
Protected 1.派生クラス(子クラス)からアクセス可能
→他プロジェクトからも可能
2.同じクラスからアクセス可能
Protected Friend 1.派生クラス(子クラス)からアクセス可能(Protected)
→他プロジェクトからも可能
2.同じプロジェクトからアクセス可能(Friend)
修飾子なし 別のプロジェクト、同じプロジェクトからアクセス可能
Private 同じクラスからアクセス可能

アクセス修飾子は、アクセスの範囲を限定します。(スコープを狭める)
範囲が限定されていると、修正時に影響する範囲が狭まり修正しやすくなります。
プロジェクトは、アセンブリとも呼ばれます。

以下は、MicrosoftのVisual Basicでのアクセスレベルのリンクです。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/declared-elements/access-levels

確認環境

プロジェクトが2つあります。vb1とvb2です。

Color.vbにアクセス修飾子をつけたメソッドがあります。
TestClass.vb内には、Color.vbにあるクラスを継承したクラスと継承していないクラスがあります。
vb1.vbは、TestClass.vb内のクラスを生成して実行します。

メソッドにアクセス修飾子をつけたクラス(Color.vb)

それぞれにアクセス修飾子をつけています。
Public、Protected Friend、Protected、Friend、なし、Privateがあります。

Public Class Color
	'Public
	Public Sub GetName1()
		Console.WriteLine("赤:Public") '
	End Sub
	'Protected Friend
	Protected Friend Sub GetName2()
		Console.WriteLine("黄:Protected Friend") '
	End Sub
	'Protected 
	Protected Sub GetName3()
		Console.WriteLine("青:Protected") '
	End Sub
	'Friend 
	Friend Sub GetName4()
		Console.WriteLine("緑:Friend") '
	End Sub
	'なし
	Sub GetName5()
		Console.WriteLine("白:なし") '
	End Sub
	'Private 
	Private Sub GetName6()
		Console.WriteLine("黒:Private") '
	End Sub
End Class

起動するファイル(vb1.vb)

TestClass.vb内のクラスを生成して実行します。

Module vb1
	Sub Main()
		Dim t1 As New TestClass1
		t1.Write1()

		Dim t2 As New TestClass2
		t2.Write2()
	End Sub
End Module

別プロジェクトのクラスを使用するクラス(TestClass.vb)

別プロジェクトのクラスを使用するクラスです。
TestClass1は、Colorクラスのインスタンスを生成して実行しています。
TestClass2は、Colorクラスを継承しているのでインスタンスの生成はしていません。

Imports vb2
Public Class TestClass1
	Public Sub Write1()
		Dim p1 As New Color
		p1.GetName1() '赤:Public
		'p1.GetName2() 'コンパイルエラー
		'p1.GetName3() 'コンパイルエラー
		'p1.GetName4() 'コンパイルエラー
		p1.GetName5() '白:なし
		'p1.GetName6() 'コンパイルエラー
	End Sub
End Class

Public Class TestClass2
	Inherits vb2.Color
	Public Sub Write2()
		GetName1() '赤:Public
		GetName2() '黄:Protected Friend
		GetName3() '青:Protected
		'GetName4() 'コンパイルエラー
		GetName5() '白:なし
		'GetName6() 'コンパイルエラー
	End Sub
End Class

別プロジェクトのクラスのインスタンスを生成した場合は、
publicとアクセス修飾子なしが実行できました。
それ以外は、コンパイルエラーです。

別プロジェクトのクラスを継承していた場合は、
publicとProtected FriendとProtectedとアクセス修飾子なしが実行できました。
それ以外は、コンパイルエラーです。

関連の記事

VB.NET入門 クラスの仕組みとサンプル
VB.NET クラスの継承の仕組みとサンプル
VB.NET コンストラクタのサンプル
VB.NET メソッドのサンプル(値渡し/参照渡し他)

△上に戻る