簡體   English   中英

f#私有類在公共內部

[英]f# private class inside public one

我有一個Java類,我需要在F#中編寫類似的類。 如何在f#中定義public內的私有類?

public class KnownRuleGoals {
    void record() {
      knownParsingSet.add(new KnownParsing());
    }

    private class KnownParsing {
        Rule [] knownParsing;
        KnownParsing() {
         ...
        }
        void doWork() { ... }
    }
}

在F#完全可能。 F#功能第一,不是純功能 - 這是它的主要優勢之一。 F#是實用的,下面的這個結構讓一個實現完全相同的結果,即使KnownParsing類型不是Java或C#意義上的“嵌套”。

type KnownRuleGoals() =
    let knownParsingSet : List<KnownParsing> = List()
    member this.Record() =
      knownParsingSet.Add(new KnownParsing())

and private KnownParsing() =
    let foo = "private fields"
    member this.DoWork() = failwith "TODO implementation"

對象表達式對於實現接口或抽象類很有用,但“父”類(創建對象表達式的類)將無法訪問其內部。 或者,更准確地說,除了通過對象表達式本身之外的ref單元格之外,沒有辦法以除了接口/抽象成員之外的任何方式創建內部構件。 這具有性能影響,例如ref細胞的GC壓力。

如何對象的表情和“通過嵌套和”類型交替工作,在我的開源項目例如IEnumerator實現。 這一行,我使用private類型,如此答案,它運作良好。 在整個項目中,我主要使用F#,因為這是獲得不錯表現的唯一方法。 我必須說我最常喜歡F#而不是C#,即使是強制性代碼也是如此。

正如人們所說,F#目前不支持嵌套類。

一個解決方法是VB所示,有兩個獨立的類,其中一個是私有的。

但是,如果內部類很簡單(僅使用一個或兩個方法),那么有一種替代方法,即使用閉包作為窮人的對象

在下面的代碼中, KnownParsing函數創建兩個函數並將它們作為一對返回。 然后, knownParsingSet包含函數對,而不是類的實例。

如果嵌套類中只有一個方法,那么這種方法很好,因為一個方法類基本上只是一個函數。 對於嵌套類中的多個方法,它會變得非常難看,這就是F#人使用其他技術解決問題的原因。 :)

type KnownRuleGoals() = 

    let knownParsingSet = System.Collections.Generic.HashSet()

    // use a function
    let KnownParsing() =
        let knownParsing = [||]
        let doWork() =
            ()  // do something
        let doWork2() =
            ()  // do something
        // return the pair of functions
        doWork,doWork2

    // the member/method comes after the closure because
    // definitions must come before usage.
    member this.record() = 
        knownParsingSet.Add(KnownParsing())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM