Chcę utworzyć bibliotekę, która utworzy obiekty za pomocą funkcji zdefiniowanej przez użytkownika i zmodyfikuje je za pomocą innej funkcji zdefiniowanej przez użytkownika.OO alternatywa dla polimorfizmu w F # podczas wywoływania F # z C#
mam tła SML i zobaczyć dość prosty sposób, aby je realizować:
//user side
type userType = { mutable time : float }
let userInitialization() = { time = 0. }
let userModification t = t.time <- t.time+1.
//my side
let algo initialization modification n =
let a = Array.init n (fun _ -> initialization())
modification a.[0]
a
Problemem jest to, że chcę, że biblioteka będzie łatwe do połączenia z C#: mający funkcje jak argumentów jest chyba zły pomysł.
Klasa interfejsu i abstrakcyjna (która byłaby dziedziczona przez userType
) wydaje się być zwyczajnym rozwiązaniem OO, ale nie mogę zainicjować obiektu, jeśli nie znam (jeszcze nieokreślonego) userType wykonującego krok inicjowania, w moim funkcja, niemożliwe.
Jedynym sposobem obejścia tego problemu jest zapytanie użytkownika o instancję jego userType
jako argumentu, który byłby używany do wywołania inicjalizacji, ale wydaje się to bardzo nieeleganckie.
Czy istnieje sposób rozwiązania tego problemu?
Bądź interfejs rodzajowe? –
Jeśli spodziewasz się dużego użycia C#, prawdopodobnie korzystasz z interfejsu, ale jest też 'Microsoft.FSharp.Core.FuncConvert' do konwersji między C#' Functions' lub 'Actions' i F #' FSharpFuncs'. Możesz użyć tego na stronie C# wraz z bieżącym kodem. – scrwtp