F#友元函数/类

F#友元函数/类,f#,oop,friend,F#,Oop,Friend,是否可以在F#中实现friend函数和friend类(如在c++中) 更新: 由于f#中没有friend函数/类,friend甚至不是未来扩展的保留关键字,我想知道f#中的friend机制是否存在任何问题,导致开发人员决定不实现它? ) 建议1:布赖恩,签名文件- 我认为这东西不能正常工作。如果有一个闭包(例如a中的lambda表达式,它与a的实例是不同的对象)来计算B.X,它将不起作用 建议2:地块(+Mitya0),内部可视- 我不清楚,你是在第二类中写这个还是把这个类暴露给整个程序集?<

是否可以在F#中实现friend函数和friend类(如在c++中)

更新: 由于f#中没有friend函数/类,friend甚至不是未来扩展的保留关键字,我想知道f#中的friend机制是否存在任何问题,导致开发人员决定不实现它? )

建议1:布赖恩,签名文件- 我认为这东西不能正常工作。如果有一个闭包(例如a中的lambda表达式,它与a的实例是不同的对象)来计算B.X,它将不起作用

建议2:地块(+Mitya0),内部可视-
我不清楚,你是在第二类中写这个还是把这个类暴露给整个程序集?< /p> < p>朋友在C++中存在的概念并不能准确地转化为f*,但是你可以使用<代码>内部< /C>可访问性修饰符来访问同一.NET程序集中的所有类。这可能就是你想要的。

从我所看到的文档来看,有一个相同的文档表明F#没有这种能力。

请注意,你可以使用签名文件来模仿friend

如果您希望
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


签名文件非常适合创建任意封装边界。

正如mitya指出的那样。只需在要查看其受保护成员的类或整个程序集上使用InternalsVisibleTo属性。(我一直这样做是为了单元测试的目的)

[]

是一种待遇。< /P>你是指“C++”中的“朋友”,还是在VB.NET中?你引用的所有文件都适用于F,包括内部的VisuButo属性>代码>内部<代码>是一个钝的工具,用CARE来管理它。内部只有在程序集大时才是钝的。@ Mitya,是的,不幸的是,

内部
强加的可见性边界与程序集边界严格重合:P@Brian:我确实同意。我也同意-签名文件是该语言最令人敬畏的功能之一,似乎没有人知道(参见)是的-不幸的是,签名强加的可见性边界目前与文件严格一致boundaries@Mitya对给人们一个有用的新功能,他们所做的就是抱怨它不够灵活。:)fsi文件不是新的——它是OCaml中模块和模块签名的精简版本。
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("UnitTestModule")>]