Шаблон проектирования посредника в OCaml

Я пытаюсь выполнить взаимную привязку между двумя классами в 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] в определении класса, но прибегал к нему (безрезультатно), пытаясь позволить посреднику сохранить ссылку на всех коллег и каждого коллегу в его соответствующий посредник, а также пытается преодолеть важность определения класса в исходном коде. Как мне разрешить коллегам сохранить ссылку на своего посредника?


person Mat Kelly    schedule 02.05.2009    source источник


Ответы (1)


Я исправил все проблемы компиляции. Когда вы наследуете от коллеги, вам необходимо указать его параметр типа. В результате, я полагаю, что для concreteColleague также требуется параметр типа. Кроме того, вы забыли передать аргумент конструктора 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;;

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

person newacct    schedule 03.05.2009
comment
Спасибо. Ваше описание очень помогло. - person Mat Kelly; 03.05.2009