繁体   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