アクセス制御とは

広告

クラス内に定義されたメソッドは、クラスから作成されたオブジェクトから実行することが可能となっています。ただ場合によってはクラス内の他のメソッドから実行されるだけのメソッドを定義する場合もあります。

クラス内からしか実行されないメソッドはオブジェクトから実行出来るようになっていると予想外の結果となることがありますのでオブジェクトからは実行出来ないようにアクセスを制限する事が可能です。

メソッドのアクセスを制限するにはメソッドのアクセス制御レベルをメソッド毎に設定します。オブジェクトからインスタンスメソッドとして実行可能なメソッドは「public」、クラス内の他のメソッドからのみ実行可能実行可能なメソッドは「private」を指定します。

アクセス制御の設定方法

では具体的なサンプルを使って確認していきます。

class Car
  def accele
    print("アクセルを踏みました¥n")
  end

  def brake
    print("ブレーキを踏みました¥n")
  end
end

「Car」クラス内で定義された「accele」メソッドと「brake」メソッドはどちらも「Car」クラスのオブジェクトから実行可能としたいので「public」を指定します。実は特に指定しない場合は「public」に設定されていますが明示的に指定してみます。

class Car
  def accele
    print("アクセルを踏みました¥n")
  end

  public :accele

  def brake
    print("ブレーキを踏みました¥n")
  end

  public :brake
end

car = Car.new
car.accele(10)

メソッドを「public」に明示的に指定するには「public :メソッド名」と記述します。ここで指定したメソッドはアクセス制御が「public」に指定されます。

では次に「private」なメソッドを作成してみましょう。

class Car
  def accele(acceletime=1)
    print("アクセルを踏みました¥n")
    print("スピードは", calcSpeed(acceletime), "Kmです¥n")
  end

  public :accele

  def brake
    print("ブレーキを踏みました¥n")
  end

  public :brake

  def calcSpeed(acceletime)
    return acceletime * 10
  end
  
  private :calcSpeed
end

car = Car.new
car.accele(10)

「calcSpeed」はアクセスを踏んだ秒数に応じて速度を計算するメソッドです。このメソッドはクラス内の「accele」メソッドからしか呼び出されません。このようなメソッドは「private」を指定します。

メソッドを「private」に明示的に指定するには「private :メソッド名」と記述します。ここで指定したメソッドはアクセス制御が「private」に指定されます。

「private」に設定されてメソッドに対して、クラスのオブジェクトから直接実行を行うとエラーとなります。例えば次のような記述は行えません。

car = Car.new
car.accele(10)
car.calcSpeed(10)

上記のように「private」指定されてメソッドに対して「car.calcSpeed(10)」のような処理は行えません。

initializeメソッドの扱い

通常のメソッドは特に指定しない場合は「public」となりますが「initialize」メソッドだけは常に「private」メソッドとして定義されます。よって「initialize」メソッドをクラスのオブジェクトから実行することは出来ません。

サンプルプログラム

では実際にサンプルを試してみます。

PrivateTest1.rb

class Car
  def accele(acceletime=1)
    print("アクセルを踏みました¥n")
    print("スピードは", calcSpeed(acceletime), "Kmです¥n")
  end

  public :accele

  def brake
    print("ブレーキを踏みました¥n")
  end

  public :brake

  def calcSpeed(acceletime)
    return acceletime * 10
  end

  private :calcSpeed
end

car = Car.new
car.accele(10)

上記を実行すると次のように表示されます。

アクセス制御

( Written by Tatsuo Ikura )