[英]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
方法。 您必须首先向ITest
或ITest2
:
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.