Come si è detto, F # non supporta attualmente classi annidate.
Una soluzione è come mostrato in V.B., con due classi separate, una delle quali è privata.
Tuttavia, se la classe interna è semplice (solo con uno o due metodi), esiste un approccio alternativo, che utilizza una chiusura come poor-person's object.
Nel codice seguente, la funzione KnownParsing
crea due funzioni e le restituisce in coppia. Il numero knownParsingSet
contiene quindi coppie di funzioni, anziché istanze di classi.
Se esiste un solo metodo nella classe nidificata, questo approccio va bene perché una classe di un metodo è fondamentalmente solo una funzione. Per più di un metodo nella classe annidata, diventa piuttosto brutto, motivo per cui le persone F # risolvono il problema con utilizzando invece altre tecniche. :)
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())
[F # non supporta classe nidificazione] (http://stackoverflow.com/questions/8948332/why-doesnt-f-support-nested-classes). – vcsjones
Nella programmazione funzionale si pensa innanzitutto alle funzioni, in OO si pensa prima agli oggetti. Stai pensando oggetto quando dovresti pensare a una funzione. Pensa come posso creare un record di funzione pubblica() che abbia una funzione nascosta KnownParsing(). Una funzione all'interno di un'altra funzione è essenzialmente privata. –
Perché tutti i voti negativi? Sembra una domanda ragionevole. – Mathias