F #: реализовать встроенный метод (On Inteface), чтобы избежать использования реального типа - PullRequest
1 голос
/ 14 декабря 2011

Я пытаюсь выяснить, можно ли применить встроенный метод к реализованному методу, чтобы не приходилось прописывать конкретный входящий тип. Я сделал это с помощью одного из методов (не унаследованных / реализованных), но пытаясь также использовать интерфейс.

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>()

Я предполагаю, что есть способ сделать это, но он не работает с универсальным оператором (?) В сигнатуре метода интерфейса.

Ответы [ 2 ]

6 голосов
/ 14 декабря 2011

Я не верю, что возможно иметь абстрактные встроенные методы. Даже если бы вы могли, ваш код не работал бы, потому что ваше определение интерфейса обещает, что пользователи могут вызывать его с любым 'a, но ваша реализация накладывает статическое ограничение члена на 'a - в гипотетическом мире, где F # поддерживает абстрактные inline методы, объявление метода в интерфейсе также должно включать ограничение.

В любом случае, чтобы понять, почему F # не поддерживает абстрактные встроенные методы, рассмотрите, что означает inline: код, который вы пишете для реализации метода, будет по существу скопирован и вставлен в сайт вызова. Однако, с абстрактным методом, вы не знаете конкретный тип, который определяет реализацию метода, поэтому нет способа выяснить во время компиляции, какой код вы должны встраивать!

3 голосов
/ 14 декабря 2011

Я думаю, что правильный ответ - реализация интерфейса может быть не встроенной. Я не уверен, почему это разрешено в определении интерфейса.

...