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