3

是否可以在 F# 中实现友元函数和友元类(如在 C++ 中)?

更新:由于 f# 中没有友元函数/类,而且friend 甚至不是未来扩展的保留关键字,我想知道 F# 中的友元机制是否有任何问题让开发人员决定不实现它? (例如在“受保护的”访问修饰符中)。

建议 1:Brian,签名文件——我认为这东西不能正常工作。如果您有一个评估 BX 的闭包(例如,A 中的 lambda 表达式,它是与 A 的实例不同的对象),它将不起作用

建议 2:Massif (+Mitya0),InternalsVisibleTo - 我不清楚,你是在第二节课上写这个,还是把这个课暴露给整个程序集?

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

正如mitya指出的那样。只需在要查看受保护成员的类或整个程序集上使用 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 回答