解决F#中的接口冲突

Rob*_*Sim 6 .net inheritance f#

我想在F#中实现此处描述的解决方案: 从具有相同方法名称的多个接口继承

具体来说,在F#中,如何实现两个接口之间共享同名的接口函数的实现?

这是C#解决方案:

public interface ITest {
    void Test();
}
public interface ITest2 {
    void Test();
}
public class Dual : ITest, ITest2
{
    void ITest.Test() {
        Console.WriteLine("ITest.Test");
    }
    void ITest2.Test() {
        Console.WriteLine("ITest2.Test");
    }
}
Run Code Online (Sandbox Code Playgroud)

The*_*Fox 11

在F#中,接口始终是显式实现的,因此这甚至不是需要解决的问题.无论方法名称是否相同,这都是您实现这些接口的方式:

type ITest =
    abstract member Test : unit -> unit

type ITest2 =
    abstract member Test : unit -> unit

type Dual() =
    interface ITest with
        member __.Test() = Console.WriteLine("ITest.Test")

    interface ITest2 with
        member __.Test() = Console.WriteLine("ITest2.Test")
Run Code Online (Sandbox Code Playgroud)

当您考虑到F#中的接口方法的访问也是显式的时,这是有意义的.如果你有一个Dual你不能调用该Test方法.您必须首先向上ITest或向上ITest2:

let func (d:Dual) = d.Test() // Compile error!

let func (d:Dual) =
    (d :> ITest).Test()
    (d :> ITest2).Test()
    // This is fine
Run Code Online (Sandbox Code Playgroud)

请注意,有一个安全的upcast运算符,:>用于以保证在编译时工作的方式来转换对象层次结构,并且不会导致运行时异常.

有时这种显式方法访问不方便,但我相信这会导致类型系统的简化,从而使更多的类型推断成为可能,并提高整体的便利性和安全性.