2011-12-14 76 views
1

我試圖查看是否可以將內聯應用於實現的方法,以便不必拼寫出進入的特定類型。我已經完成了一個(不是繼承/實現)方法,但也嘗試使用接口。F#:實現內聯方法(On Inteface)以避免使用實際類型

type public IBookInteraction = 
    abstract inline CreateBook : 'a -> MethodResult<BasicBookModel> 


type public BookInteraction(?userInteraction) = 

    interface IBookInteraction with 

    member inline x.CreateBook(bookModel) = 
    let userId = (^a : (member UserId : Int32 with get) (bookModel)) 

    MethodResult<BasicBookModel>() 

我猜有辦法做到這一點,但它並沒有一個通用的運算符(?)在接口方法的簽名工作。

回答

6

我不相信有可能有抽象的內聯方法。即使你可以,你的代碼也不行,因爲你的接口定義承諾用戶可以用任何'a來調用它,但是你的實現在'a上放置了一個靜態成員約束 - 在F#支持抽象內聯方法的假設世界中,聲明在界面上的方法也需要包含約束。

在任何情況下,要明白爲什麼F#無法支持抽象內聯方法,請考慮一下inline意味着:您爲實現該方法編寫的代碼將基本上被複制並粘貼到調用站點中。但是,使用抽象方法,您不知道定義方法實現的具體類型,因此無法在編譯時找出您應該內聯的代碼!

+0

是的,_abstract內聯methods_絕對是無稽之談。只需添加更多信息 - 編寫_static內聯方法非常有用。這是有效的,因爲編譯器完全知道你在調用哪個方法,所以它可以被內聯。也許這就是爲什麼語法允許它的原因(儘管編譯器應該仍然認爲這是無稽之談)。見例如:http://tomasp.net/blog/fsharp-generic-numeric.aspx –

+0

@Tomas - 絕對是。即使是內聯方法,只要它們是非虛擬的,它們都是合理的。 – kvb

3

我認爲正確的答案是接口的實現可能沒有內聯。我不確定爲什麼它在接口定義中是允許的。

相關問題