我需要調用類的一個靜態成員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
查看靜態解析的類型約束。 –
@Gustavo - 我不需要用實例調用它。事實上它不依賴於實例(因爲它是靜態的)。我想用實例調用它,因爲我不能用類名稱來調用它,因爲在調用的時候,類可以是幾種選擇中的任何一種。如果F#讓我從實例中調用它,則問題將得到解決。 – Soldalma