3.8 継承

継承を説明するため、「点」のクラスから継承によって定義された、「色付きの点」のクラスを定義してみましょう。このクラスは 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 に適用することができます。 また pget 以外のメソッドを持つこともできます。これは 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>