Yes, here is some code. Any help would be very much appreciated.
The following fails to type check:
class p (x: int) = object
method plus1 : int = x + 1
end
class p2 (x: int) = object
inherit p x
method plus2 : int = x + 2
end
class r = object (self)
val mutable l = []
method make_el x = new p x
method add (x: int) : unit = l <- (self#make_el x) :: l
method length : int = List.length
l
method total : int = List.fold_left (fun t el -> t + el#plus1) 0 l
end
class r2 = object
inherit r
method make_el x = new p2 x
method total2 : int = List.fold_left (fun t el -> t + el#plus2) 0 l
end
What I am trying to do is to replace, in l, elements of type p with elements of type p2, so that my class r2 can offer more methods (or use them internally). However, the compiler complains that p2 and p are not compatible, because p does not have method plus2 (in spite of the fact that no runtime error can occur).
I am not a deep expert of Ocaml type system for classes, as you might have guessed by now, so if someone were able to suggest a set of type casts/notations/... that would make the above go through, I would be very grateful.
In my real (large) code, I use the elements of the list l in many places inside the code of r (and by inheritance, r2).
Do you have any code that we can look at to see what the problem is? Can
you perhaps construct a small yet complete example that demonstartes the
issue?
--
William D. Neumann