多重継承をすることもできます。同じメソッドの定義の内、最後のものだけが有効です。もし子クラスで参照可能な親クラスのメソッドが子クラスで再び定義された場合、メソッドは子クラスのものに上書きされます。しかし、親クラスの定義も、親クラスを識別子に束縛することにより用いることができます。次の例では、super
が親クラスである printable_point
に束縛されています。 super
は疑似的な変数名で、 super#print
のように親クラスのメソッドを呼び出すためにのみ用いることができます。
#
class printable_colored_point y c = object (self) val c = c method color = c inherit printable_point y as super method print = print_string "("; super print; print_string ", "; print_string (self color); print_string ")" end;;
class printable_colored_point : int -> string -> object val c : string val mutable x : int method color : string method get_x : int method move : int -> unit method print : unit end
#
let p' = new printable_colored_point 17 "red";;
new point at (10, red) val p' : printable_colored_point = <obj>
#
p'#print;;
(10, red)- : unit = ()
親クラスのプライベートメソッドで、子クラスから隠蔽されているものは継承によって上書きされません。初期化子はプライベートメソッドと見なされるので、子クラスに至るクラス階層で定義されたすべての初期化子は、それが導入された順に評価されます。