Ruby のお勉強 - クラス -

公開日:2014-12-28 更新日:2019-05-13
[Ruby]

クラス

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 #エラー
##src|1 1 3 ##/e## 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
クラスメソッドの中でインスタンス変数を使うと、クラス変数のような動作になる。
但し、クラス変数として @@変数名 で使うことはできない。