Ich versuche, das Visitor Design Pattern mit OCamls OO-Konstrukten und dem Typsystem zu implementieren und stoße bei der Instantiierung eines Elements auf Probleme.Visitor Design Pattern in 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;;
Der Fehler, den ich bei der Zusammenstellung erhalten ist:
The type of this expression, <visitSalesman : 'a -> unit; _.. > salesman as 'a,
contains type variables that cannot be generalized.
jedoch kompiliert den Code minus der Linie, die die salesman
Instanziierung.
Wie gehe ich bei der Instanziierung der salesman
unter Beibehaltung der Funktionalität der Klassen?
bearbeiten Fehler empfangen mit Aufruf receiveEvaluation:
This expression has type (<getName:string>, < getName:string>) lowerLevelHRRep
but is here used with type <visitSalesman : 'a salesman -> unit > as 'a.
Der zweite Objekttyp hat keine Methode visitAccountant
.
Das scheint Kompilierung Problem gelöst haben, aber ich bekomme eine ähnliche, wenn ich versuche, mit einem Aufruf einer Funktion in einem Verkäufer-Objekt zu kompilieren. Wie gehe ich vor, um die Funktion aufzurufen? Danke noch einmal! –
Nicht sicher, dass ich dieses Problem verstehe, können Sie etwas Code posten? Außerdem fügte ich eine hoffentlich einfachere (wenn auch begrenzte) Lösung mit rekursiven Definitionen hinzu. Ich hoffe es hilft! –
Ihre ist eine viel elegantere Lösung, um das Gleiche zu erreichen. Ich habe den Code in der ursprünglichen Frage aktualisiert, wenn Sie glauben, dass es ein Mittel gibt, um das zu erreichen, was ich in der Überarbeitung gefordert habe. –