Ruby のお勉強 - クラス -

公開日:2014-12-28

クラス

ソース
class TestClass
  #コンストラクタ
  def initialize
    p "initialize"
  end
  
  def test
    "Hello"
  end
end

obj = TestClass.new
p obj.test
実行結果
"initialize"
"Hello"
デストラクタはない。
メソッドは普通に定義すると public になる。


ソース
class TestClass
  public
  
    def test1
      "test1"
    end
    
    def test2
      "test2"
    end

  private
  
    def test3
      "test3"
    end
    
  protected
  
    def test4
      "test4"
    end
end

obj = TestClass.new
p obj.test1
p obj.test2
#p obj.test3 #エラー
#p obj.test4 #エラー
実行結果
"test1"
"test2"
private にしたい場合は、メソッドの前の行に private と書く。
private 以降のメソッドは、全て private となる。
途中で public または protected を書くことで変更することも可能。


ソース
class TestClass
  def getValue
    @value
  end
  
  def setValue(value)
    @value = value
  end
end
obj = TestClass.new
obj.setValue 5
p obj.getValue
実行結果
5
インスタンス変数は @変数名と書く。使用する前に宣言する必要はない。
デフォルトの可視性は private。


ソース
class TestClass
  attr          :value1 #読み込み専用。書き込むとエラー
  attr_reader   :value2 #読み込み専用。書き込むとエラー
  attr_accessor :value3 #読み書き可能
  attr_writer   :value4 #書き込み専用。読み込むとエラー
  
  #複数定義することもできる
  attr          :valueA, :valueB
  
  def initialize
    @value1, @value2, @value3, @value4, @value5 = [1, 1, 1, 1, 1]
  end
  
end

obj = TestClass.new

#読み込み専用
#obj.value1 = 5 #エラー
p obj.value1
#obj.value2 = 5 #エラー
p obj.value2

#読み書き可能
obj.value3 = 3
p obj.value3

#書き込み専用
obj.value4 = 4
#p obj.value4 #エラー
実行結果
1
1
3
attr を使って、インスタンス変数のアクセス権限を定義できる。
定義する時は、シンボルを使う。
また、attr でインスタンス変数が定義されている訳ではない。


ソース
class TestClass
  def self.test
    "Hello"
  end
end

p TestClass.test
実行結果
"Hello"
クラスメソッドは、メソッド名の前に self. を付ける。


ソース
class TestClass
  @@value = 0
  def getValue
    @@value
  end
  def addValue
    @@value = @@value + 1  
  end
  
  def self.getValue2
    @@value
  end
end

obj1 = TestClass.new
obj1.addValue
obj1.addValue
p obj1.getValue

obj2 = TestClass.new
p obj2.getValue

p TestClass.getValue2
実行結果
2
2
2
クラス変数は @@変数名 と書く。クラスの外からはアクセスできない。


ソース
class TestClass
  def test1
    p "test1"
  end
  def test2
    p "test2"
  end
end

class TestClassEx < TestClass
  def test1
    super
    p "test1Ex"
  end
  def test2
    p "test2Ex"
  end
end

obj = TestClassEx.new
obj.test1
obj.test2
実行結果
"test1"
"test1Ex"
"test2Ex"
クラスを継承する時は、< を使う。
super で、親のメソッドを実行できる。
オーバーライドする時は、メソッド名を親と同じにするだけで良い。


ソース
class TestClass
  def showValue
    p @value
  end
end

class TestClassEx < TestClass
  def test2
    showValue
    @value = 10
    showValue
  end
end

obj = TestClassEx.new
obj.test2 
実行結果
nil
10
メソッドは super を使って親で定義されたメソッドを呼び出せるけど、
インスタンス変数は、親子で共通の変数となる。


ソース
class TestClass
  attr_accessor :value
end

class TestClassEx
end

obj = TestClass.new
obj.value = 1
p obj.value

objEx = TestClassEx.new
#objEx.value = 2 #エラー
#p objEx.value   #エラー
実行結果
1
attr によるアクセス権限は継承されない。
あくまでもアクセス権限を定義しているだけなので、
継承先のクラスでインスタンス変数にアクセスするとエラーになる。


ソース
class TestClass
  attr_accessor :value
end
class TestClassEx
  attr_reader   :value
end

obj = TestClass.new
obj.value = 1
p obj.value

objEx = TestClassEx.new
#objEx.value = 2 #エラー
p objEx.value
実行結果
1
nil
アクセス権限は継承して上書き可能。


ソース
class TestClass
  @@obj = TestClass.new
  
  def self.getInstance
    @@obj
  end
  
  def test
    p "Hello"
  end
end
obj = TestClass.getInstance
obj.test
実行結果
"Hello"
クラスメソッド(staticメソッド)は、メソッド名の前に self. を付ける。


ソース
class TestClass
  def self.test1
      @a = 5
  end
  def self.test2
      p @a
      #p @@a #エラー
  end
  
  def test3
    p @a
  end
end
TestClass.test1
TestClass.test2
TestClass.new.test3
実行結果
5
nil
クラスメソッドの中でインスタンス変数を使うと、クラス変数のような動作になる。
但し、クラス変数として @@変数名 で使うことはできない。