2010-07-08 116 views
3

是否可以在F#中實現朋友函數和朋友類(如C++中)?F#朋友功能/類

更新: 由於在F#無友元函數/類,以及朋友甚至不是爲將來的擴展保留關鍵字,我不知道有沒有用在F#的朋友機制,使開發商的任何問題決定不執行它? (such as in "protected" access modifier)。

建議1:布賴恩,簽名文件 - 我不認爲這件事情能正常工作。如果你有一個封閉該評估BX(以A例如lambda表達式,這是一個不同的對象比A的實例),這是行不通的

建議2:地塊(+ Mitya0),InternalsVisibleTo - 我不清楚,你是在第二堂課寫作還是將課堂暴露給整個大會?

+0

你的意思是「朋友」在C++中,或在VB.NET? – 2010-07-08 05:38:41

回答

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

簽名文件非常適合創建任意封裝邊界。

+0

我喜歡此解決方案! – 2010-07-08 07:21:53

+0

我也是 - 簽名文件有點兒是這個語言中最棒的功能之一,似乎沒人知道(請參閱http:// stackoverflow。com/questions/181613/hidden-features-of-f/1844881#1844881) – Brian 2010-07-08 16:26:56

+0

是的 - 不幸的是,簽名強加的可見性邊界目前嚴格與文件邊界重合 – 2010-07-08 21:05:42

2

C++中存在的朋友的概念並不完全轉化爲F#,但您可以使用internal輔助功能修飾符來訪問同一.NET程序集中的所有類。這可能是你正在尋找的。

+0

'內部'是一個鈍器,小心使用它。 – Brian 2010-07-08 07:06:02

+0

如果你的裝配很大,內部只是鈍。 – 2010-07-08 21:03:16

+0

@Mitya,是的,不幸的是,「內部」強加的可見性邊界與裝配邊界嚴格一致。 :P – Brian 2010-07-09 07:19:37

1

從我看到的文檔中,有一個friend notion in C#,,但同樣的文檔表明F#沒有這種能力。

+4

您引用的所有文檔都適用於F#,包括InternalsVisibleTo屬性 – 2010-07-08 06:07:28

3

正如mitya指出的那樣。只需在要查看受保護成員的類上或在整個程序集上使用InternalsVisibleTo屬性即可。 (我爲了單元測試目的而一直這樣做)。

[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("UnitTestModule")>] 

作品一種款待。