OCamlでCompositeパターン
30分プログラム、その552。CompositeパターンをOCamlでやってみる。
OCamlのOはオブジェクトのO、オブジェクト指向と言えばデザインパターンということで、OCamlでCompositeパターンを実装してみた。
バリアント使えと言うのは野暮ってもんです。
使い方
let root = new directory let bin = new directory let tmp = new directory let usr = new directory let _ = root#add (bin :> entry); root#add (tmp :> entry); root#add (usr :> entry); bin#add (new file 1000); bin#add (new file 2000) let _ = Printf.printf "%d\n" root#get_size (* 3000 *)
ソースコード
let (@@) f g = f g class virtual entry = object method virtual get_size : int end class file size = object inherit entry method get_size = size end class directory = object(self) inherit entry val mutable children = [] method add (x : entry) = children <- x::children method get_size = let sum = List.fold_left (+) 0 in sum @@ List.map (fun x -> x#get_size ) children end (* Sample *) let root = new directory let bin = new directory let tmp = new directory let usr = new directory let _ = root#add (bin :> entry); root#add (tmp :> entry); root#add (usr :> entry); bin#add (new file 1000); bin#add (new file 2000); Printf.printf "%d\n" root#get_size