Jamie Dixon
Jamie Dixon

Reputation: 4302

Implement a C# Interface in F#

I have the following interface in C#

public interface IDog
{
    String Bark();
}

I want to create an implementation in F#. I had no problem with this:

type GermanShepherd() = 
        interface IDog with
            member this.Bark() = "Woof"

but when I added a supporting function that is not part of the interface like this:

type GermanShepherd() = 
        interface IDog with
            member this.Bark() = "Woof"
            member this.Eat() = "Yummy" 

the compiler complained:

Error   1   No abstract or interface member was found that corresponds to this override 
Error   2   This value is not a function and cannot be applied*

Is there a way of implementing private/internal functions with a type that implements an interface without those functions being part of the interface? I can't change the interface in my 'real' application b/c there are other projects that implement the interface. None of the examples on MSDN that I found have this particular scenario.

Upvotes: 3

Views: 415

Answers (1)

Tomas Petricek
Tomas Petricek

Reputation: 243096

The interface block should only contain functions that are part of the interface, but you can place other functions before the block:

type GermanShepherd() = 
    member this.Eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"

If you do not need a public member, then you can go with a private let-bound function:

type GermanShepherd() = 
    let eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"

Also note that F# currently only allows explicit interface implementations, which means that you can treat GermanShepherd as IDog, but you won't see IDog members explicitly:

let g = GermanShepherd()
g.Eat()            // OK
g.Bark()           // Error, interface members are implemented explicitly
let d = g :> IDog  // To 'Bark', we need to get 'IDog' first
d.Bark()           // OK

One workaround for this is to add the Bark method explicitly as a separate member outside of the interface block. Although there is F# language issue for this too!

Upvotes: 10

Related Questions