2

わかりました、C# には明示的なインターフェイスの実装が あります。F# で同様のことをしたいと思います。

私はいくつかのインターフェース(およびクラス)を持っています

type IState = interface
    abstract member Update : IAction-> IState
    ...
end
type IEnviroment = interface
    abstract member Update : IAction-> IEnviroment
    ...
    end


type IBoard  = 
    inherit IState
    inherit IEnviroment
    abstract member Update : Move -> IBoard
    ...

[<AbstractClass>]
and Move ()= 
    abstract member Apply : IBoard -> IBoard
    interface IAction with        
        override this.Cost = 1M

したがって、私が抱えている問題は、 Update が3回異なる方法で定義されていることです。したがって、C# のExplitit Interface Implementationに相当するものが必要です。インターフェイスに実装することを考えています (F# では合法であるため) - いくつかの型キャストで構成されるだけです。

私の理解では、F# でのすべてのインターフェイスの実装はクラスで明示的ですが、インターフェイスが別のインターフェイスから継承されると、そのインターフェイスのみを (明示的に) 実装します。(したがって、私の Board クラスは I Board のみを実装します)

4

1 に答える 1

3

member this.IState.Updateの実装で構文を試しましたIBoardが、コンパイラはそれを拒否しました。

あなたが望むことを行うための仕様の方法がわかりません。

抽象クラスを使用して呼び出しを各インターフェイスに転送する、このような名前の競合に対する回避策を次に示します。

type I1 =
    interface
        abstract F : unit -> unit
    end

type I2 =
    interface
        abstract F : unit -> unit
    end

type II =
    interface
        inherit I1
        inherit I2
        abstract F : unit -> unit
    end

[<AbstractClass>]
type III() =
    abstract F1 : unit -> unit
    abstract F2 : unit -> unit
    abstract F3 : unit -> unit
    interface I1 with
        member this.F() = this.F1()
    interface I2 with
        member this.F() = this.F2()

type Works() =
    inherit III()
    override this.F1() = printfn "F1"
    override this.F2() = printfn "F2"
    override this.F3() = printfn "F3"

type Fails() =
    interface II with
        member this.F() = ()
于 2012-05-05T15:46:52.837 に答える