Rubyのクラス定義

Rubyでは、

  • クラスはclassキーワードで定義
  • インスタンスメソッドはクラス内でdefキーワードを使って定義
  • 新規インスタンスはクラスメソッドnewで作成
  • newメソッドを定義する必要はない
  • コンストラクタは定義できないが、代わりにinitializeメソッドがnew実行時に呼ばれる
  • インスタンス変数は頭に@を付ける
  • インスタンス変数の宣言は不要、というか宣言なんて無い
  • 未初期化のインスタンス変数から読み出し可能、nilが入っている
  • クラス変数はアタマに@@
  • 未初期化のクラス変数は読めない(例外発生)
class C
    def initialize
       @v = ほげ
    end
    def m
         p @v 
    end
end

c = C.new
c.m        # "ほげ"と表示

Javaでは同じ名前のクラス、メソッドがあった場合、コンパイルに失敗する。Rubyでは、同名のクラスがあると、クラス定義の続きになる。その中に同名のメソッドがあった場合、後から読み込んだメソッドで上書きされる。

class Hoge
    def a
         p "hoge"
    end
end

hoge = Hoge.new
hoge.a                   # "hoge"と表示

class Hoge
    def a
         p "hogehoge"    # 先のaメソッドは上書きされる
    end
end

hoge.a                   # "hogehoge"と表示

これはだめ

class Fuga 
end

class Piyo 
end

class Hoge < Fuga
end

class Hoge < Piyo
end

HogeクラスをFugaのサブクラスと先に定義した場合は、Piyoのサブクラスとして上書きすることはできない。