Le modèle de conception du médiateur dans OCaml
-
03-07-2019 - |
Question
J'essaie de créer une liaison mutuelle entre deux classes dans OCaml (modèle du médiateur) et j'obtiens une erreur lors de la compilation.
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;;
Erreur: le collègue du constructeur de la classe attend 1 argument (s) de type, mais s'applique ici aux arguments de type 0.
Je ne peux pas dire que je connais très bien la syntaxe ['foo] dans la définition de la classe, mais j'y ai eu recours (sans résultat) en essayant de permettre au médiateur de conserver une référence à tous ses collègues et chaque collègue à son médiateur respectif tout en essayant de dépasser l’importance de la définition d’une classe dans le code source. Comment puis-je permettre aux collègues de garder une référence à leur médiateur?
La solution
J'ai résolu tous les problèmes de compilation. Lorsque vous héritez de collègue, vous devez fournir son paramètre de type. Par conséquent, concreteColleague a également besoin d’un paramètre de type. De plus, vous avez oublié de passer l'argument constructeur mIn à la classe héritée. Et j’ai ajouté un paramètre de type à votre garde de type pour myColleague, en utilisant le type de l’objet.
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;;
Cependant, je ne connais pas bien le motif Mediator, je ne sais donc pas quelle est la bonne façon de mettre en œuvre ce motif. Êtes-vous certain d’avoir besoin d’objets, de classes virtuelles, etc.?