アクセス制御 (F#)
アクセス制御とは、特定のプログラム要素 (型、メソッド、関数など) を使用できるクライアントを宣言することです。
アクセス制御の基礎
F# では、モジュール、型、メソッド、値の定義、関数、プロパティ、および明示的フィールドにアクセス制御指定子 public、internal、および private を適用できます。
public は、すべての呼び出し元がエンティティにアクセスできることを示します。
internal は、同じアセンブリからのみエンティティにアクセスできることを示します。
private は、エンティティを囲む型またはモジュールからのみエンティティにアクセスできることを示します。
注意
アクセス指定子 protected は、F# では使用しません。ただし、protected アクセスをサポートする言語で作成された型を使用している場合は許容されます。したがって、プロテクト メソッドをオーバーライドした場合は、メソッドが、クラスおよびその子孫の内部でのみアクセス可能になります。
一般に、アクセス制御指定子は、エンティティの名前の前に置きます。ただし、mutable 指定子または inline 指定子を使用する場合は、これらの指定子の前にアクセス制御指定子を置きます。
アクセス指定子を使用しない場合は、既定で public が使用されます。ただし、型の let 束縛は、常に型に対して private です。
F# のシグネチャは、F# のプログラム要素へのアクセスを制御する別の機構を提供します。 シグネチャは、アクセス制御に必須ではありません。 詳細については、「シグネチャ (F#)」を参照してください。
アクセス制御の規則
アクセス制御は、次の規則に従います。
継承宣言 (inherit を使用してクラスの基本クラスを指定すること)、インターフェイス宣言 (クラスがインターフェイスを実装することの指定)、および抽象メンバーのアクセシビリティは、常に、これらを囲む型と同じです。 したがって、これらの構成要素でアクセス制御指定子を使用することはできません。
判別共用体の個別のケースで、共用体型とは別の独自のアクセス制御修飾子を使用することはできません。
レコード型の個別のフィールドで、レコード型とは別の独自のアクセス制御修飾子を使用することはできません。
例
次のコードは、アクセス制御指定子の使用例を示しています。 プロジェクトには、Module1.fs と Module2.fs の 2 つのファイルがあります。 各ファイルは、実質的にはモジュールです。 したがって、Module1 と Module2 の 2 つのモジュールが存在します。 Module1 では、プライベート型と内部型が定義されます。 Module2 からプライベート型にアクセスすることはできませんが、内部型にはアクセスできます。
// Module1.fs
module Module1
// This type is not usable outside of this file
type private MyPrivateType() =
// x is private since this is an internal let binding
let x = 5
// X is private and does not appear in the QuickInfo window
// when viewing this type in the Visual Studio editor
member private this.X() = 10
member this.Z() = x * 100
type internal MyInternalType() =
let x = 5
member private this.X() = 10
member this.Z() = x * 100
// Top-level let bindings are public by default,
// so "private" and "internal" are needed here since a
// value cannot be more accessible than its type.
let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()
// let bindings at the top level are public by default,
// so result1 and result2 are public.
let result1 = myPrivateObj.Z
let result2 = myInternalObj.Z
次のコードは、Module1.fs で作成された型のアクセシビリティをテストします。
// Module2.fs
module Module2
open Module1
// The following line is an error because private means
// that it cannot be accessed from another file or module
// let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()
let result = myInternalObj.Z