継承を説明するため、「点」のクラスから継承によって定義された、「色付きの点」のクラスを定義してみましょう。このクラスは point
クラスのすべてのインスタンス変数とメソッドに加えて新しいインスタンス変数である c
とメソッドの color
を持っています。
#
class colored_point x (c : string) = object inherit point x val c = c method color = c end;;
class colored_point : int -> string -> object val c : string val mutable x : int method color : string method get_offset : int method get_x : int method move : int -> unit end
#
let p' = new colored_point 5 "red";;
val p' : colored_point = <obj>
#
p'#get_x, p'#color;;
- : int * string = (5, "red")
「点」は color
メソッドを持たないので「点」と「色付きの点」は異なった型を持っています。しかし、次の get_x
関数は get
メソッドをもつ任意のオブジェクト p
に適用することができます。 また p
は get
以外のメソッドを持つこともできます。これは get_x
の型に含まれる ..
によって表されています。ですから、get_x
は「点」と「色付きの点」の両方に適用できます。
#
let get_succ_x p = p#get_x + 1;;
val get_succ_x : < get_x : int; .. > -> int = <fun>
#
get_succ_x p + get_succ_x p';;
- : int = 8
次の例が示すように、メソッドがあらかじめ定義されている必要はありせん。
#
let set_x p = p#set_x;;
val set_x : < set_x : 'a; .. > -> 'a = <fun>
#
let incr p = set_x p (get_succ_x p);;
val incr : < get_x : int; set_x : int -> 'a; .. > -> 'a = <fun>