【发布时间】:2020-01-27 07:03:05
【问题描述】:
如何从重写方法中的计算表达式调用基本 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.
这条神秘的信息是什么意思?我正在给一位公众成员打电话 直接实现它,就像编译器“想要”一样。
那么主要的问题是,在这种情况下如何调用基本方法?什么是 惯用的 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
我并不是真的在寻找解决方法,但看到其他人会很有趣。
【问题讨论】:
标签: f#