Следующий пример кода демонстрирует реализацию шаблона посетителя в F #
module VisitorPattern
type IVisitor =
abstract Visit : ObjectA -> unit
abstract Visit : ObjectB -> unit
and IVisitable =
abstract InvokeVisit : IVisitor -> unit
and ObjectA =
interface IVisitable with
member this.InvokeVisit (visitor: IVisitor) =
visitor.Visit(this)
and ObjectB =
interface IVisitable with
member this.InvokeVisit (visitor: IVisitor) =
visitor.Visit(this)
type MyVisitor =
member this.Visit (a : ObjectA) =
printfn "Visited object A"
member this.Visit (b : ObjectB) =
printfn "Visited object B"
Это прекрасно компилируется, но мы ограничены тем, что все типы, реализующие IVisitable
в одном файле, из-за использования ключевого слова and
. Это ключевое слово, по-видимому, необходимо для учета взаимных ссылок типов.
Есть ли способ реализовать этот шаблон таким образом, чтобы мы не были ограничены одним файлом?
(я не спрашиваю мнения о том, следует ли использовать этот шаблон в F #)
РЕДАКТИРОВАТЬ: я задаю этот вопрос, потому что шаблон посетителей имеет отношение при взаимодействии с кодом C #.