Как вызвать базовый метод F # из выражения вычисления в переопределенном методе?
Вот несколько надуманных примеров удивительной проблемы. Не спрашивайте, зачем мне нужен именно этот сценарий, фактический вариант использования имеет больше смысла, но его трудно представить. В частности, async
не имеет значения, в реальном случае я использую другое выражение для вычисления и даже не требует взрыва (!
) для вызова базового метода. Но симптомы те же.
// Base class with a virtual method
type T1 () =
abstract Test : unit -> Async<unit>
default _.Test () =
async {
printfn "In test"
}
// Derived class with an overridden method calling the base in a computation expression
type T2 () =
inherit T1 ()
override _.Test () =
async {
do! base.Test ()
}
let t2 = T2 ()
t2.Test () |> Async.RunSynchronously
Приведенный выше код не может скомпилироваться:
error FS0405: A protected member is called or 'base' is being used. This is
only allowed in the direct implementation of members since they could
escape their object scope.
Что означает это крипти c сообщение? Я вызываю publi c член из его прямой реализации, как того «хочет» компилятор.
Главный вопрос тогда, как мне вызвать базовый метод в таких случаях? Что такое идиоматический c F # способ?
Возможны обходные пути, например:
type T1 () =
abstract Test : unit -> Async<unit>
default m.Test () =
m.DoTest ()
member _.DoTest () =
async {
printfn "In test"
}
type T2 () =
inherit T1 ()
override m.Test () =
async {
do! m.DoTest ()
}
let t2 = T2 ()
t2.Test () |> Async.RunSynchronously
На самом деле я не ищу обходных путей, но было бы интересно увидеть других.