4


0

F#実装インターフェイス、複数のパラメーター、エラーの取得でこのオーバーライドは異なる数の

F#で次のインターフェイスを定義しました

[]
type ICarRentalService =
    []
    abstract member CalculatePrice: pickupDate:DateTime -> returnDate:DateTime -> pickupLocation:string -> vehiclePreference:string -> float

それから私はこれを次のように実装しようとしました:

type CarRentalService() =
    interface ICarRentalService with
        override this.CalculatePrice(pickupDate:DateTime, returnDate:DateTime, pickupLocation:string, vehiclePreference:string) =
            5.5

コンパイルすると、次のコンパイルエラーが発生します。

This override takes a different number of arguments to the corresponding abstract member

私は今その物を見て、1時間いじっていますが、何が間違っていますか?

1 Answer


6


インターフェースのメソッドはカリー形式で宣言され、実装はタプルされます:簡単に言うと、インターフェースのメソッドは、ある引数を受け入れ、残りの引数を持つ別の関数を返す関数です。 逆の実装では、すべての引数を1つのピース(タプルにパック)で受け入れます。

open System
type ICarRentalService =
    abstract member CalculatePrice: pickupDate:DateTime -> returnDate:DateTime -> pickupLocation:string -> vehiclePreference:string -> float

let x : ICarRentalService = failwith "not implemented"
let a = x.CalculatePrice // DateTime -> DateTime -> string -> string -> float
let y = a (DateTime.Now) // DateTime -> string -> string -> float (first argument is bound)

コードを修正するには、実装をカリー化または宣言する必要があります。 CurriedバージョンはWCFでは動作しないため、タプルバージョンの使用を検討してください

type ICarRentalService =
    abstract member CalculatePrice: pickupDate:DateTime * returnDate:DateTime * pickupLocation:string * vehiclePreference:string -> float

type CarRentalService() =
    interface ICarRentalService with
        override this.CalculatePrice(pickupDate:DateTime, returnDate:DateTime, pickupLocation:string, vehiclePreference:string) =
            5.5