F # Реализация интерфейса, несколько параметров, при получении ошибки это переопределение занимает разное число - PullRequest
4 голосов
/ 06 ноября 2010

Я определил следующий интерфейс в F #

[<ServiceContract>]
type ICarRentalService =
    [<OperationContract>]
    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 Ответ

6 голосов
/ 06 ноября 2010

Метод в вашем интерфейсе объявлен в каррированном виде, а ваша реализация имеет кортеж: если кратко: метод в интерфейсе - это функция, которая принимает один аргумент и возвращает другую функцию с остальными аргументами. В противоположной реализации все аргументы принимаются одним куском (упаковано в кортеж)

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)

Для исправления кода вам нужно либо сделать реализацию каррированной, либо объявить с тьюплингом. Карри версия не будет работать с 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
...