F # вызывать функцию-член из другой функции типа при реализации интерфейса

#f#

#f#

Вопрос:

Это рабочий пример из here:

 type MethodExample() = 

    // standalone method
    member this.AddOne x = 
        x   1

    // calls another method
    member this.AddTwo x = 
        this.AddOne x |> this.AddOne
  

Это то, что я хочу сделать:

 type IMethod =   
    abstract member  AddOne: a:int -> int
    abstract member  AddTwo: a:int -> int

type MethodExample() =     
    interface IMethod with

        member this.AddOne x = 
            x   1

        // calls another method
        member this.AddTwo x = 
            this.AddOne x |> this.AddOne
  

AddOne Функция недоступна, я также пытался перенести это в MethodExample, но это ужасно и не работает.

Как я могу это сделать?

Комментарии:

1. Когда я сталкиваюсь с подобной проблемой, я обычно ставлю AddOne на MethodExample , переименовываю на _AddOne , тогда я могу вызвать это внутри реализации интерфейса. Это может быть некрасиво, но это работает.

Ответ №1:

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

Следовательно, чтобы получить к ним доступ, вам нужно сначала привести свой класс к интерфейсу:

 member this.AddTwo x = 
    let me = this :> IMethod
    me.AddOne x |> me.AddOne