[英]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.