我有一个Java类,我需要在F#中编写类似的类.如何在f#中定义public内的私有类?
public class KnownRuleGoals {
void record() {
knownParsingSet.add(new KnownParsing());
}
private class KnownParsing {
Rule [] knownParsing;
KnownParsing() {
...
}
void doWork() { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
在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"
Run Code Online (Sandbox Code Playgroud)
对象表达式对于实现接口或抽象类很有用,但"父"类(创建对象表达式的类)将无法访问其内部.或者,更准确地说,除了通过对象表达式本身之外的ref单元格之外,没有办法以除了接口/抽象成员之外的任何方式创建内部构件.这具有性能影响,例如ref细胞的GC压力.
在我的开源项目中看到这个例子,关于对象表达式和"嵌套的via和"类型如何互换地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())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |