全てのオブジェクトが共通に行う処理、それは「クラスが呼び出すメソッド」だッ。
実はちゃんと「クラスメソッド」という呼び名がついている。それに対して多くのメソッドはオブジェクトが呼び出す。「そのクラスから作られたオブジェクトが呼び出すんだ」という意味で「インスタンスメソッド」と呼べば「クラスメソッド」と区別できる。
そしてワタシは「クラスメソッド」をひとつ知っているのだった。それはnew。(本書165ページ)
ただし、newは特別なクラスメソッドで、オブジェクトが作成されたあとそのオブジェクトが「initialize」という「インスタンスメソッド」を呼び出すキマリになっている。そのinitializeメソッド、すでに「インスタンス変数に値を設定するためのあたりまえの習慣の通過儀礼」みたいになっているが、そんな退屈な生活にズバーッと変化をもたらしてやるのだ。それはリスト3-1。
リスト3-1 initializeメソッドに必殺のひとこと
def initialize(name, cost)
@name=name
@cost=cost
report
end
これで、クラスメソッドnewを「引数」だけ変えて呼び出せば、その引数に相当する全てのオブジェクトが作成された上に、ソイツらがreportメソッドまで読んでしまう。
クラスEnemyの定義は、これまでの内容にリスト3-1の一言を加えるだけ。
そしてトップレベルの処理は、リスト3-2だけになる。
リスト3-2 トップレベルはなんとnewだけ
###トップレベル### e1=Enemy.new("E-1", 5000) e2=Enemy.new("E-2", 3000) e3=Enemy.new("E-DX", 8500) #これはカンタンだ!が....
なにヨ博士ぇ。何か文句アリ?