почему реализация моего абстрактного члена не является публичной - PullRequest
1 голос
/ 13 июня 2011

Я изо всех сил пытался заставить это скомпилироваться около часа.Это должно быть что-то глупое.Вы можете заметить это?

в моем проекте lib:

namespace TravelerStuff
open System

type Traveler =         
    abstract GetData : unit -> unit

type public DeltaTraveler() =
    interface Traveler with
         member v.GetData () =

        printf "hello"

и в моем тестовом приложении консоли:

[<EntryPoint>] let main _ =
    let traveler = new TravelerStuff.DeltaTraveler()
    traveler.GetData // this line won't compile: (The field, constructor or member 'GetData' is not defined)

Ответы [ 2 ]

6 голосов
/ 13 июня 2011

Как говорит gradbot, F # в настоящее время не выполняет неявное преобразование значений в интерфейсы при поиске членов.Кроме того, F # использует только явную реализацию интерфейса (как известно из C #), а не неявную реализацию , где члены не только скомпилированы как реализация интерфейса, но также и как обычные (непосредственно видимые)члены типа.

Помимо приведения, вы можете дублировать член в определении типа:

type DeltaTraveler() =    
  member v.GetData () = printf "hello"
  interface Traveler with
    member v.GetData () = v.GetData() 

Кроме того, если вы просто хотите реализовать интерфейс, но не нуждаетесьчтобы добавить любые члены, вы можете использовать выражения объекта F # (которые являются более легкими):

let deltaTraveler() =
  { new Traveler with
      member v.GetData () = printf "hello" }

// The function directly returns value of type 'Traveler'
let t = deltaTraveler()
t.GetData()
3 голосов
/ 13 июня 2011

Вам нужно upcast.F # в настоящее время не сделает этого за вас в этой ситуации.

(traveler :> TravelerStuff.Traveler).GetData()

// open the namespace to reduce typing.

open TravelerStuff
(traveler :> Traveler).GetData()

Снимок из F # документов.

Во многих объектно-ориентированных языках, обновлениенеявный;в F # правила немного отличаются.Обновление применяется автоматически, когда вы передаете аргументы в методы типа объекта.Однако для функций с привязкой в ​​модуле обновление не происходит автоматически, если тип параметра не объявлен как гибкий тип.Для получения дополнительной информации см. Гибкие типы (F #) .

...