3

F# でフレンド関数とフレンド クラス (C++ のように) を実装することは可能ですか?

更新: f# にはフレンド関数/クラスがなく、friend は将来の拡張のための予約済みキーワードでさえないため、F# のフレンド メカニズムに問題があり、開発者がそれを実装しないことを決定するのではないかと考えています。 (「保護された」アクセス修飾子など)。

提案 1 : ブライアン、署名ファイル - これが適切に機能するとは思わない。BX を評価するクロージャ (たとえば、A のインスタンスとは異なるオブジェクトである A のラムダ式) がある場合、それは機能しません。

提案 2 : Massif (+Mitya0), InternalsVisibleTo - 私にはわかりません.2 番目のクラスでこれを書いていますか、それともクラスをアセンブリ全体に公開していますか?

4

4 に答える 4

11

署名ファイルを使用して友人を模倣できることに注意してください。

Aの友達になりたい場合はB、他の人が見ることができないAの内部にアクセスできます。たとえば、次のことができます。B

// File1.fs
type B() =
    let x = 42  // private field
    member this.X = x // public getter

type A() =
    member this.PeekInto(b : B) =
        b.X

しかしまた持っている

// File1.fsi
type B = 
    new : unit -> B
    // do not expose X in the signature

type A = 
    new : unit -> A
    PeekInto : B -> int

そして今Aの実装は見えますB.Xが、プログラムの続編は見えませんB.X

署名ファイルは、任意のカプセル化境界を作成するのに非常に優れています。

于 2010-07-08T07:02:57.000 に答える
3

ミティアさんのご指摘の通りです。保護されたメンバーを表示するクラス、またはアセンブリ全体で InternalsVisibleTo 属性を使用するだけです。(私は単体テストの目的でこれを常に行っています)。

[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("UnitTestModule")>]

御馳走を働きます。

于 2010-07-08T13:35:19.030 に答える
2

C ++に存在するフレンドの概念は、F#に正確に変換されませんが、internalアクセシビリティ修飾子を使用して、同じ.NETアセンブリ内のすべてのクラスへのアクセスを許可できます。これはおそらくあなたが探しているものです。

于 2010-07-08T05:29:42.340 に答える
1

私がドキュメンテーションを見たところ、C# にはフレンドの概念がありますが、同じドキュメンテーションは、F# にはこの機能がないことを示唆しています。

于 2010-07-08T05:47:18.027 に答える