J'essaye d'implémenter le modèle de conception de visiteur en utilisant les constructions OO d'OCaml et le système de type et suis en train de rencontrer des problèmes lors de l'instanciation d'un élément.Modèle de conception de visiteur dans OCaml
class virtual ['hrRep] employee = object
method virtual receiveEvaluation : 'hrRep -> unit
method virtual getName : string
end;;
class ['hrRep] accountant myName = object (self : 'a)
inherit ['hrRep]employee
val name = myName
method receiveEvaluation rep = rep#visitAccountant self
method getName = name
end;;
class ['hrRep] salesman myName = object (self : 'a)
inherit ['hrRep]employee
val name = myName
method receiveEvaluation rep = rep#visitSalesman self
method getName = name
end;;
class virtual ['accountant, 'salesman] hrRep = object (self)
method virtual visitSalesman : 'salesman -> unit
method virtual visitAccountant : 'accountant -> unit
end;;
class ['employee, 'salesman] lowerLevelHRRep =
object (self) inherit ['employee, 'salesman]hrRep
method visitSalesman s = print_endline ("Visiting salesman "^s#getName)
method visitAccountant a =
print_endline ("Visiting accountant "^a#getName)
end;;
let s1 : (<visitSalesman : 'a -> unit>) salesman = new salesman "Bob";;
let a1 : (<visitAccountant : 'a -> unit>) accountant = new accountant "Mary";;
let s2 : (<visitSalesman : 'a -> unit>) salesman = new salesman "Sue";;
let h1 : (<getName : string>, <getName : string>) lowerLevelHRRep = new lowerLevelHRRep;;
s1#receiveEvaluation h1;;
L'erreur que je reçois lors de la compilation est:
The type of this expression, <visitSalesman : 'a -> unit; _.. > salesman as 'a,
contains type variables that cannot be generalized.
Cependant, le code compile moins la ligne instanciation du salesman
.
Comment faire pour instancier le salesman
tout en conservant la fonctionnalité des classes?
Modifier erreur reçu avec l'appel à receiveEvaluation:
This expression has type (<getName:string>, < getName:string>) lowerLevelHRRep
but is here used with type <visitSalesman : 'a salesman -> unit > as 'a.
Le deuxième type d'objet n'a pas de méthode visitAccountant
.
Cela semble avoir résolu ce problème de compilation, mais j'en obtiens un similaire lorsque j'essaie de compiler avec un appel à une fonction dans un objet vendeur. Comment puis-je appeler la fonction? Merci encore! –
Je ne suis pas certain de comprendre ce problème, pouvez-vous poster du code? De plus, j'ai ajouté une solution plus simple (quoique limitée) avec des définitions récursives. J'espère que cela aide! –
Votre solution est beaucoup plus élégante pour accomplir la même chose. J'ai mis à jour le code dans la question initiale si vous croyez qu'il y a un moyen d'accomplir ce que j'ai demandé dans la révision. –