アクセス制御とは
クラス内に定義されたメソッドは、クラスから作成されたオブジェクトから実行することが可能となっています。ただ場合によってはクラス内の他のメソッドから実行されるだけのメソッドを定義する場合もあります。
クラス内からしか実行されないメソッドはオブジェクトから実行出来るようになっていると予想外の結果となることがありますのでオブジェクトからは実行出来ないようにアクセスを制限する事が可能です。
メソッドのアクセスを制限するにはメソッドのアクセス制御レベルをメソッド毎に設定します。オブジェクトからインスタンスメソッドとして実行可能なメソッドは「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」メソッドをクラスのオブジェクトから実行することは出来ません。
サンプルプログラム
では実際にサンプルを試してみます。
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 )