簡體   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