Я пытаюсь внедрить шаблон дизайна посетителя с использованием OCO OCO и создавать систему типов, и я сталкиваюсь с проблемами при создании элемента.Шаблон проектирования посетителей в 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;;
Я получаю ошибку при компиляции:
The type of this expression, <visitSalesman : 'a -> unit; _.. > salesman as 'a,
contains type variables that cannot be generalized.
Однако код компилирует минус строка экземпляра salesman
.
Как мне создать экземпляр salesman
при сохранении функциональности классов?
Редактировать Ошибка получено с вызовом receiveEvaluation:
This expression has type (<getName:string>, < getName:string>) lowerLevelHRRep
but is here used with type <visitSalesman : 'a salesman -> unit > as 'a.
Второй тип объекта не имеет какого-либо метода visitAccountant
.
Это, похоже, разрешило проблему с компиляцией, но я получаю подобный, когда пытаюсь скомпилировать с вызовом функции в объекте продавца. Как мне обратиться к функции? Еще раз спасибо! –
Не уверен, что я понимаю эту проблему, можете ли вы опубликовать код? Кроме того, я добавил, надеюсь, более простое (хотя и ограниченное) решение с использованием рекурсивных определений. Надеюсь, поможет! –
Это гораздо более элегантное решение для достижения того же. Я обновил код в исходном вопросе, если вы считаете, что есть способ выполнить то, что я спросил в ревизии. –