클래스 생성자를 호출하는 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