3.5 抽象メソッド

virtual というキーワードを用いることで、メソッドを宣言だけして定義しないですますことができます。このようなメソッドのことを抽象メソッドと呼びます。抽象メソッドの定義は後に子クラスで与えることができます。抽象メソッドを含むクラスを抽象クラスと呼びます。抽象クラスを定義する際には、クラス定義にも virtual キーワードが必要です。また、抽象クラスのインスタンス、つまりこのクラスのオブジェクトを生成することはできません。一方、抽象クラスの定義は、通常のクラスと同じく型名を定義します。抽象クラスに対応する型では抽象メソッドは、通常のメソッドと同じように扱われます。

#class virtual abstract_point x_init =
   object (self)
     method virtual get_x : int
     method get_offset = self get_x - x_init
     method virtual move : int -> unit
   end;;
class virtual abstract_point :
  int ->
  object
    method get_offset : int
    method virtual get_x : int
    method virtual move : int -> unit
  end

#class point x_init =
   object
     inherit abstract_point x_init
     val mutable x = x_init
     method get_x = x
     method move d = x <- x + d 
   end;;
class point :
  int ->
  object
    val mutable x : int
    method get_offset : int
    method get_x : int
    method move : int -> unit
  end
    

インスタンス変数も virtual と宣言することで、メソッドの場合と同じ効果が得られます。

#class virtual abstract_point2 =
   object
     val mutable virtual x : int
     method move d = x <- x + d 
   end;;
class virtual abstract_point2 :
  object val mutable virtual x : int method move : int -> unit end

#class point2 x_init =
   object
     inherit abstract_point2
     val mutable x = x_init
     method get_offset = x - x_init
   end;;
class point2 :
  int ->
  object
    val mutable x : int
    method get_offset : int
    method move : int -> unit
  end