F#朋友功能/类

时间:2010-07-08 05:23:17

标签: f# oop friend

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

更新: 由于f#中没有友元函数/类,而朋友甚至不是未来扩展的保留关键字,我想知道F#中的朋友机制是否有任何问题导致开发人员决定不执行它? (such as in "protected" access modifier)。

建议1 :Brian,签名文件 - 我认为这件事情不合适。如果你有一个闭包(例如A中的lambda表达式,它是一个与A的实例不同的对象)来评估B.X,那么它将不起作用

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

4 个答案:

答案 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#没有这种能力。