F # OOP - Реализация интерфейса - проблема с частным и именем метода - PullRequest
2 голосов
/ 07 апреля 2011

В тупик с ООП интерфейсом F # вопрос.

Пример - когда я создаю класс и пытаюсь реализовать один метод Run (строка, строка, строка) из примера пространства имен из интерфейса IRunner Я вижу в .NET Reflector то, что действительно создается, это частный метод с именем Example-IRunner-Run (строка, строка, строка). Если я затем хочу представить это обратно в C # lib, это создает проблему. Через рефлексию - код, который я не контролирую, просто ищет класс с открытым методом Run. Как мне решить? Кажется, не могу найти никакой документации по этому вопросу.

Проблема 1 - Выполнение должно быть общедоступным, так как оно становится приватным
Проблема 2 - сумасшедшее длинное имя метода - вместо просто Run

Не уверен, нужно ли мне использовать некоторые ключевые слова-модификаторы или файл подписи ... просто не только с чего начать с (1) приватного и (2) странного имени метода (рефлексия не найдет)

примечание: в этом примере Run возвращает int
В этой текущей реализации я просто пытаюсь вернуть 1 в «доказательство концепции», что я могу сделать эту простую вещь в F #

пример кода:

namespace MyRunnerLib

open Example

type MyRunner() = class
  interface IRunner with 
   member this.Run(s1, s2, s3) = 1
end

Ответы [ 3 ]

3 голосов
/ 07 апреля 2011

Кроме того, есть несколько вариантов, как написать это.Версия Роберта имеет фактическую реализацию в дополнительном члене.Если вы поместите реализацию в интерфейс, вы можете избежать приведения.
(Также обратите внимание, что вам не нужны class .. end ключевые слова):

type MyRunner() = 
  member this.Run(a,b,c) = 1
  interface IRunner with 
    member this.Run(a,b,c) = this.Run(a,b,c)

Немного более ясный способопределить функциональность как локальную функцию, а затем просто экспортировать ее два раза:

type MyRunner() = 
  // Implement functionality as loal members
  let run (a, b, c) = 1

  // Export all functionality as interface & members
  member this.Run(a,b,c) = run (a, b, c)
  interface IRunner with 
    member this.Run(a,b,c) = run (a, b, c)
1 голос
/ 07 апреля 2011

Первая ссылка в ответе Euphorics содержит решение.Для справки, я повторю это здесь.Вам необходимо реализовать перенаправляющий член в вашем классе с помощью интересующего вас метода. Это связано с тем, что интерфейсы явно реализованы в F #, тогда как в C # по умолчанию используется неявная реализация интерфейса.В вашем случае:

namespace MyRunnerLib

open Example

type MyRunner() = class
  interface IRunner with 
   member this.Run(s1, s2, s3) = 1
  member this.Run(s1, s2, s3) = (this :> IRunner).Run(s1,s2,s3)
end
1 голос
/ 07 апреля 2011
...