Как создать интерфейс с дополнительными методами в F # - PullRequest
1 голос
/ 21 июля 2009

Я пытаюсь создать интерфейс, который требует дополнительных методов поверх IEvent, например:

type Varying<'t> = 
    abstract member Get : unit -> 't
    abstract member Set : 't -> unit
    abstract member AddHandler : Handler<'t> -> unit
    abstract member RemoveHandler : Handler<'t> -> unit
    member v.Add(f) = v.AddHandler(new Handler<_>(fun _ x -> f x))
    interface IEvent<'t> with
        member c.AddHandler(h) = c.AddHandler(h)
        member c.RemoveHandler(h) = c.RemoveHandler(h)
        member c.Add(f) = c.Add(f)

Я добавил Get & Set методы. Проблема в том, что компилятор F # хочет, чтобы я реализовал абстрактные члены:

Реализация абстрактного члена Varying.AddHandler: Handler <'t> -> unit'

не предоставлена.

Но смысл этого типа в том, что член является абстрактным. Что я делаю не так?

1 Ответ

6 голосов
/ 21 июля 2009

Вы можете добавить [<AbstractClass>] метку к своему определению:

> [<AbstractClass>]
- type Varying<'t> =
-     abstract member Get : unit -> 't
-     abstract member Set : 't -> unit
-     abstract member AddHandler : Handler<'t> -> unit
-     abstract member RemoveHandler : Handler<'t> -> unit
-     member v.Add(f) = v.AddHandler(new Handler<_>(fun _ x -> f x))
-     interface IEvent<'t> with
-         member c.AddHandler(h) = c.AddHandler(h)
-         member c.RemoveHandler(h) = c.RemoveHandler(h)
-         member c.Add(f) = c.Add(f)
- ;;

type Varying<'t> =
  class
    abstract member AddHandler : Handler<'t> -> unit
    abstract member Get : unit -> 't
    abstract member RemoveHandler : Handler<'t> -> unit
    abstract member Set : 't -> unit
    interface IEvent<'t>
    member Add : f:('t -> unit) -> unit
  end
...