プログラミング入門(6)〜アクセス制御
下記のページを参考にプログラミングの勉強を行います。
アクセス制御とは - アクセス制御 - Ruby入門
アクセス制御をまとめて設定する - アクセス制御 - Ruby入門
アクセス制御とは
アクセス制御とは
クラス内に定義されたメソッドは、クラスから作成されたオブジェクトから実行することが可能となっている。しかし、場合によってはクラス内の他のメソッドから実行されるだけのメソッドを定義する場合もある。
クラス内からしか実行されないメソッドはオブジェクトから実行できるようになっていると予想外の結果となることがあるので、オブジェクトから実行できないようにアクセスを制限することが可能。
メソッドのアクセスを制御するにはメソッドのアクセス制御レベルをメソッド毎に設定する。オブジェクトからインスタンスメソッドとして実行可能なメソッドは「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
メソッドを「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」に設定されたメソッドに対して、クラスのオブジェクトから直接実行を行うとエラーとなる。
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) car.calcSpeed(10)
上記のように「private」に指定されたメソッドに対して「car.calcSpeed(10)」のような処理は行えない。
initializeメソッドの扱い
通常のメソッドは特に指定しない場合は「public」となるが、「initialize」メソッドだけは常に「private」メソッドとして定義される。したがって「initialize」メソッドをクラスのオブジェクトから実行することはできない。
アクセス制御をまとめて設定する
アクセス制御をまとめて設定する
アクセス制御を設定するには「public:メソッド名」または「private:メソッド名」で個々のメソッド毎に設定していたが、多くのメソッドを定義する場合はまとめてアクセス制御を設定することが可能。
プログラム内に「public」とだけ記述すると、それ以降に定義されたメソッドはすべて「public」なメソッドとなり、同様に「private」とだけ記述すると、それ以降に定義されたメソッドはすべて「private」なメソッドとなる。
class Car public def accele(acceletime=1) print("アクセルを踏みました\n") print("スピードは", calcSpeed(acceletime),"Kmです\n") end def brake print("ブレーキを踏みました\n") end private def calcSpeed(acceletime) return acceletime * 10 end end car = Car.new car.accele(10)
上記の例では「public」の後に「accele」メソッドと「brake」メソッドが定義されており、この2つのメソッドは「public」なメソッドとなる。また、その後で「private」が記述されておりその後に定義されている「calcSpeed」メソッドは「private」なメソッドとなる。