次の方法で共有


Access Control

アクセス制御 とは、型、メソッド、関数など、特定のプログラム要素を使用できるクライアントを宣言することです。

アクセス制御の基本

F# では、アクセス制御指定子 publicinternal、および private を、モジュール、型、メソッド、値定義、関数、プロパティ、および明示的フィールドに適用できます。

  • public は、すべての呼び出し元がエンティティにアクセスできることを示します。

  • internal は、エンティティに同じアセンブリからのみアクセスできることを示 します

  • private は、外側の型またはモジュールからのみエンティティにアクセスできることを示します。

アクセス指定子 protected は F# では使用されませんが、 protected アクセスをサポートする言語で作成された型を使用している場合は許容されます。 したがって、保護されたメソッドをオーバーライドした場合、メソッドはクラスとその子孫内でのみアクセスできます。

アクセス指定子は、エンティティの名前の前に配置されます。

アクセス指定子を使用しない場合、既定値は publicされます。ただし、型の let バインドは除き、常に型に private されます。

F# のシグネチャは、F# プログラム要素へのアクセスを制御するための別のメカニズムを提供します。 アクセス制御には署名は必要ありません。 詳細については、「 署名」を参照してください。

アクセス制御の規則

アクセス制御には、次の規則が適用されます。

  • 継承宣言 (つまり、 inherit を使用してクラスの基底クラスを指定する)、インターフェイス宣言 (つまり、クラスがインターフェイスを実装することを指定する)、および抽象メンバーは、常に外側の型と同じアクセシビリティを持ちます。 そのため、これらのコンストラクトではアクセス制御指定子を使用できません。

  • 判別共用体内の個々のケースのアクセシビリティは、判別共用体自体のアクセシビリティによって決まります。 つまり、特定の共用体ケースは、共用体自体と同程度にアクセスできます。

  • レコード型の個々のフィールドのアクセシビリティは、レコード自体のアクセシビリティによって決まります。 つまり、特定のレコード ラベルは、レコード自体と同じアクセス性を持ちます。

次のコードは、アクセス制御指定子の使用方法を示しています。 プロジェクトには、 Module1.fsModule2.fsの 2 つのファイルがあります。 各ファイルは暗黙的にモジュールです。 そのため、 Module1Module2の 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

こちらも参照ください