モジュールMix-inのルール

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

クラス名は、ArrayやStringと名詞であるのに対し、ComparableやEnumerableなどモジュール名は形容詞が付いています。
モジュールは、クラスに共通するような機能を追加するために使われるというイメージです。
また、モジュールは、実際にはクラスの継承と同じように振舞います。

module M1
  def method
    puts "モジュールM1のメソッド"
  end
end
 
module M2
  def method
    puts "モジュールM2のメソッド"
  end
end
 
module M3
  include M2
end
 
class C
  def method
    puts "クラスCのメソッド"
  end
  include M1
  include M2
end
 
class D
  include M1
  include M2
end
 
class E
  include M3
  include M1
end
 
p C.ancestors   # 単純継承のような動作
C.new.method    # 同名のメソッドはクラスのものが優先
 
D.new.method    # 後からインクルードしたモジュールのメソッドが優先
 
p E.ancestors   # 入れ子のモジュールも単純継承のような動作
 

実行結果。

[C, M2, M1, Object, Kernel]
クラスCのメソッド
モジュールM2のメソッド
[E, M1, M3, M2, Object, Kernel]

「C, M, Object, Kernel」とモジュール(M)がクラス(C)のancestorsに含まれていることを確認できます。
また、クラス内とモジュール内に同名のメソッドが含まれている場合は、クラスのメソッドが優先されます。
複数のモジュールをインクルードして同名のメソッドが含まれる場合は、後からインクルードされたモジュールのメソッドが優先されます。
また、モジュールが入れ子になっている場合も、単純継承のように振舞います。


日時: 2008年07月04日 20:06
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/422

この記事にトラックバックされる方は、参照先が分かるようにするために、「モジュールMix-inのルール」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - Ruby勉強ルーム