Шаблон дизайна посредника в OCaml - PullRequest
1 голос
/ 03 мая 2009

Я пытаюсь установить взаимную привязку между двумя классами в OCaml (по образцу посредника) и получаю сообщение об ошибке при компиляции.

class virtual ['mediator] colleague mIn = object 
 val m = mIn
 method virtual getmediator : 'mediator
end;;

class concreteColleague mIn = object inherit colleague 
 method getmediator = m
end;;

(* Some other classes here *)

class mediator = object (self)
 val mutable myColleague = (None:colleague option)
 initializer 
  myColleague <- Some (new concreteColleague self)
end;;

Ошибка: Коллега конструктора класса ожидает 1 аргумента (ов) типа, но здесь применяется к аргументам 0 типа.

Не могу сказать, что я хорошо знаком с синтаксисом ['foo] в определении класса, но прибегаю к нему (безрезультатно), пытаясь разрешить посреднику сохранять ссылку на всех коллег каждый коллега своему соответствующему посреднику, одновременно пытаясь преодолеть важность определения класса в исходном коде. Как мне разрешить коллегам сохранять ссылку на своего посредника?

1 Ответ

3 голосов
/ 03 мая 2009

Я исправил все проблемы компиляции. Когда вы унаследовали от коллеги, вам необходимо указать параметр типа. В результате, конкретная Коллегия, я считаю, тоже нуждается в параметре типа. Кроме того, вы забыли передать аргумент конструктора mIn унаследованному классу. И я добавил параметр типа к вашему сторожевому типу для myColleague, используя тип объекта.

class virtual ['mediator] colleague mIn = object 
 val m = mIn
 method virtual getmediator : 'mediator
end;;

class ['mediator] concreteColleague mIn =
 object inherit ['mediator] colleague mIn
 method getmediator = m
end;;

(* Some other classes here *)

class mediator = object (self : 'self)
 val mutable myColleague = (None:'self colleague option)
 initializer 
  myColleague <- Some (new concreteColleague self)
end;;

Однако я не знаком с шаблоном посредника, поэтому я не уверен, как правильно реализовать шаблон посредника. Вы уверены, что вам нужны объекты, виртуальные классы и прочее?

...