2

この状況を処理する正しい方法は何ですか。F# クラスの DogTree には、両方のインターフェイスに Bark() メソッドを実装するという要件を満たすメソッドが 1 つあります。

type ITree =
    interface
        abstract Bark : unit -> unit
        abstract Grow : unit -> unit
    end

type IDog =
    interface
        abstract Bark : unit -> unit
        abstract ChaseCar : unit -> unit
    end

type TreeDog = 
   // so the "and" syntax below doesn't work - what is the correct way to handle?
   interface IDog and ITree with
      member this.Bark() = printfn "Bark" 
4

2 に答える 2

6

一般的な実装に委任できます。

type TreeDog = 
  interface IDog with
    member this.Bark() = printfn "Bark" 
  interface ITree with
    member this.Bark() = (this :> IDog).Bark()

または、より適切に:

type TreeDog = 
  member this.Bark() = printfn "Bark"
  interface IDog with
    member this.Bark() = this.Bark() 
  interface ITree with
    member this.Bark() = this.Bark()

Bark(これは、両方のインターフェースの実装として使用される、という名前のクラスに追加のメソッドを定義することに注意してください。)

クラスでプライマリコンストラクターを宣言する場合は、代わりにこれを使用できます。

type TreeDog() = // primary constructor
  let bark() = printfn "Bark" // this member is private
  interface IDog with
    member this.Bark() = bark()
  interface ITree with
    member this.Bark() = bark()
于 2012-05-21T02:46:02.543 に答える
3

これはかなりエレガントです

type TreeDog() = 
  let bark() = printfn "Bark" 
  interface IDog with
    member this.Bark() = bark()
  interface ITree with
    member this.Bark() = bark()
于 2012-05-21T03:03:23.847 に答える