Jak już mówiono, F # obecnie nie obsługuje klas zagnieżdżonych.
Jedno obejście jest takie, jak pokazuje V.B., z dwiema oddzielnymi klasami, z których jedna jest prywatna.
Jeśli jednak wewnętrzna klasa jest prosta (tylko z jedną lub dwiema metodami), istnieje alternatywne podejście, , które ma używać zamknięcia jako poor-person's object. W poniższym kodzie funkcja tworzy dwie funkcje i zwraca je jako parę. Wówczas knownParsingSet
zawiera pary funkcji, a nie wystąpienia klas.
Jeśli w klasie zagnieżdżonej jest tylko jedna metoda, to podejście jest w porządku, ponieważ jedna klasa metod jest po prostu funkcją. Dla więcej niż jednej metody w klasie zagnieżdżonej staje się dość brzydka, dlatego F # ludzie rozwiązują problem z użyciem innych technik. :)
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 # nie obsługuje klasy zagnieżdżanie] (http://stackoverflow.com/questions/8948332/why-doesnt-f-support-nested-classes). – vcsjones
W programowaniu funkcjonalnym myśli się najpierw funkcje, w OO myśli się obiekty najpierw. Myślicie o przedmiocie, kiedy powinniście myśleć o funkcji. Pomyśl, jak utworzyć publiczny rekord funkcji(), który ma ukrytą funkcję KnownParsing(). Funkcja wewnątrz innej funkcji jest zasadniczo prywatna. –
Dlaczego wszystkie głosy na dół? To brzmi jak rozsądne pytanie. – Mathias