クラスコンストラクタを呼び出すクラスbefore
の静的メンバーを呼び出す必要があります。クラスはインターフェイスを実装しており、後でafter the object is constructed
に同じ静的メンバーを呼び出す必要があります(多態的に)。静的メソッドに多態的にアクセスできますか?
私はいくつかの言語は、1ドットの前にインスタンス名を持つ静的メソッドにアクセスすることができ、
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