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?

Était-ce utile?

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.?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top