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运算符,:>
用于以保证在编译时工作的方式来转换对象层次结构,并且不会导致运行时异常.
有时这种显式方法访问不方便,但我相信这会导致类型系统的简化,从而使更多的类型推断成为可能,并提高整体的便利性和安全性.