2015-04-08 6 views
5

Ich habe eine Schnittstelle in F # mit einer überladenen Methode definiert. Wie pro Compiler Anforderung verwendet die Überlastung fach vervielfachten Argumente statt curried diejenigen:F #: Implementieren einer Schnittstelle mit überladenen Elementen

type IInterface = 
    abstract member Do : (int * string) -> unit 
    abstract member Do : int -> unit 

ich dann eine Klasse erstellen, die die Schnittstelle implementiert:

type ImplementingClass = 
    interface IInterface with 
     member this.Do (i, s) =() 
     member this.Do i =() 

jedoch den Compiler-Fehler für die erste Dabei Ausbeuten von beiden Methoden: "Diese Überschreibung nimmt eine andere Anzahl von Argumenten zum entsprechenden abstrakten Mitglied"

Was mache ich hier falsch?

Antwort

9

Es gibt einen feinen Unterschied zwischen den beiden folgenden:

abstract member Do : int * string -> unit 
abstract member Do : (int * string) -> unit 

Wenn Sie die Klammern hinzufügen, Sie sagen, dass der Parameter ein Tupel und der Compiler sollte ein Verfahren unter Tuple<int, string> produzieren. Ohne Klammern wird die Methode mit zwei Parametern kompiliert. Meistens ist dies versteckt und Sie können es ignorieren - aber leider nicht immer.

So können Sie entweder Ihre Schnittstellendefinition ändern, um gewöhnliche "Zweiparameter" -Methode zu verwenden (dies wäre meine bevorzugte Methode - Sie können die Methode immer noch mit Tupel als Argument aufrufen und sieht in .NET/C besser aus Ansicht):

type IInterface = 
    abstract member Do : int * string -> unit 
    abstract member Do : int -> unit 

type ImplementingClass = 
    interface IInterface with 
     member this.Do (i, s) =() 
     member this.Do i =() 

Oder Sie die Schnittstelle implementieren kann, wie es ist:

type ImplementingClass = 
    interface IInterface with 
     member this.Do((i:int, s:string)) =() 
     member this.Do(i:int) =() 

Leider ist dies ein bisschen hässlich - Sie Typenannotationen müssen, damit der Compiler eindeutig die Methode, die Sie entscheiden können, Implementieren.

Verwandte Themen