繁体   English   中英

解决F#中的接口冲突

[英]Addressing interface conflicts in 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");
    }
}

在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")

当您考虑到F#中接口方法的访问也是显式的时,这是有意义的。 如果您有Dual ,则无法调用Test方法。 您必须首先向ITestITest2

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

let func (d:Dual) =
    (d :> ITest).Test()
    (d :> ITest2).Test()
    // This is fine

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM