是否可以在F#中实现友元函数和朋友类(如c ++)?
更新: 由于f#中没有友元函数/类,而朋友甚至不是未来扩展的保留关键字,我想知道F#中的朋友机制是否有任何问题导致开发人员决定不执行它? (such as in "protected" access modifier)。
建议1 :Brian,签名文件 - 我认为这件事情不合适。如果你有一个闭包(例如A中的lambda表达式,它是一个与A的实例不同的对象)来评估B.X,那么它将不起作用
建议2 :Massif(+ Mitya0),InternalsVisibleTo - 我不清楚,你是在第二课中写这个还是将课程暴露给整个集会?
答案 0 :(得分: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
。
签名文件非常适合创建任意封装边界。
答案 1 :(得分:3)
正如mitya指出的那样。只需在要查看受保护成员的类上或整个程序集上使用InternalsVisibleTo属性。 (我一直这样做是为了进行单元测试)。
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("UnitTestModule")>]
努力享受。
答案 2 :(得分:2)
C ++中存在的朋友概念并不完全转换为F#,但您可以使用internal
辅助功能修饰符来允许访问同一.NET程序集中的所有类。这可能就是你要找的东西。
答案 3 :(得分:1)
从我看到的文档来看,有一个friend notion in C#,,但同样的文档表明F#没有这种能力。