osiire’s blog

ふしぎなそふとやさん

バイナリメソッドのある継承される事を想定した基底クラスが自身の型のリストを持っている時に、そのクラスを継承したクラスがサブタイピングで複数の異なる型の継承クラスを基底クラスのリストにアペンドする例。

言葉にすると訳分からんね。

class virtual ['me] sprite = object ( self )
  val cs : 'me sprite list = []
  method add_children c = {< cs = c :: cs >}
  method children = cs
  method virtual show : unit
  method print = self#show; List.iter (fun c -> c#show) cs
end

class msg m = object ( self:'me )
  inherit ['me] sprite
  val m : string = m
  method show = print_string m
end

class num i = object ( self:'me )
  inherit ['me] sprite
  val i : int = i
  method show = print_int i; print_newline()
end

let _ =
  let a = new msg "a\n" in
  let b = new msg "b\n" in
  let n = new num 1 in
  let comp =
    ( a # add_children ( b :> msg sprite ) ) # add_children ( n :> num sprite )
  in
  comp#print