Pregunta

Estoy tratando de lograr un enlace mutuo entre dos clases en OCaml (a la Mediator Pattern's) y obtengo un error en la compilación.

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;;

Error: el colega del constructor de clase espera 1 argumento (s) de tipo, pero aquí se aplica a 0 argumentos de tipo.

No puedo decir que estoy tan familiarizado con la sintaxis de ['foo] en la definición de clase, pero he recurrido a ella (sin ningún resultado) al intentar que el mediador mantenga una referencia a todos los colegas y cada colega a su mediador respectivo mientras intenta superar la importancia de la definición de una clase en el código fuente. ¿Cómo hago para permitir que los colegas mantengan una referencia a su mediador?

¿Fue útil?

Solución

He arreglado todos los problemas de compilación. Cuando hereda de un colega, debe proporcionar su parámetro de tipo. Como resultado, concreteColleague creo que también necesita un parámetro de tipo. Además, olvidó pasar el argumento del constructor mIn a la clase heredada. Y agregué un parámetro de tipo a tu guarda de tipo para myColleague, usando el tipo del objeto.

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;;

Sin embargo, no estoy familiarizado con el patrón de mediador, por lo que no estoy seguro de cuál es la forma correcta de implementar el patrón de mediador. ¿Estás seguro de que necesitas objetos y clases virtuales y esas cosas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top