【发布时间】:2017-09-23 20:22:23
【问题描述】:
我需要调用类构造函数before 的静态成员。该类实现了一个接口,稍后我将需要在after the object is constructed 上调用(多态)相同的静态成员。
我相信有些语言允许使用点之前的实例名称访问静态方法,例如
myClassInstance.staticMethod
F# 似乎不允许这样做,特别是如果类继承自接口,因为接口不能包含静态方法。
下面的代码举例说明了这个问题:
module Types
type IMult =
abstract member Something : float
abstract member MultBy : float -> float
open Types
type Point(x: float) =
interface Types.IMult with
member this.Something with get() = x
member this.MultBy (x: float) =
(this :> IMult).Something * x
static member public foo x = x + 3.0
let myPointConstructorArgument = Point.foo 5.0
let pt = Point(myPointConstructorArgument)
printfn "%f" <| (pt :> IMult).MultBy 10.0 // OK: 80.0
let bar (instnc: IMult) = instnc.foo // Error: foo not defined
let pt0 = Point(bar pt 6.0) // No good: error above
我的问题是:是否有可能以某种方式检索对象的类,然后调用抽象方法?
我尝试了以下方法:
let ptType = pt0.GetType()
let mtd = ptType.foo // Error: foo not defined
let mtd = ptType.GetMethod("foo") // Ok, but not what I need, see below
let i2 = mtd 3.0 // Error: mtd is not a function
对替代方法有什么建议吗?
【问题讨论】:
-
你可以将它定义为扩展方法,但是为什么你需要用实例调用它呢?它似乎不受实例本身的影响。
-
查看静态解析的类型约束。
-
@Gustavo - 我不需要用实例调用它。实际上它不依赖于实例(因为它是静态的)。我想用实例来调用它,因为我不能用类名来调用它,因为在调用时,类可以是几种选择中的任何一种。如果 F# 让我从实例中调用它,问题将得到解决。
标签: static f# polymorphism