メソッドのアクセス制限(public,private,protected)

クラス内に定義されたメソッドは、クラスから作成されたインスタンスから呼び出すことができます。ただ場合によってはクラス内の他のメソッドから実行されるだけのメソッドを定義したい場合もあります。このような場合はメソッドがどこからアクセス可能なのか設定を行うことができます。ここでは Ruby でクラスで定義したメソッドのアクセス制限を行う方法について解説します。

(Last modified: )

アクセス制限の設定方法

クラス内に定義したメソッドへのアクセスを制限する場合、インスタンスからインスタンスメソッドとして呼び出し可能なメソッドには public 、クラス内の他のメソッドからのみ呼び出し可能なメソッドには private を使って次のようにクラス内に記述します。

他に protected が用意されています。 private に近いものですが、どのように使うべきものなのか理解ができていないのでここでは説明を省略させて頂きます。

public: メソッド名
private: メソッド名
protected: メソッド名

メソッドに対するこの記述は対象のメソッドが定義されたあとで記述する必要があります。

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

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

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

「Car」クラス内で定義された「accele」メソッドと「brake」メソッドはどちらも「Car」クラスのインスタンスから呼び出し可能としたいので public を指定します。なお特に指定しない場合は public が設定されているとみなされるため、 public の場合は明示的に指定しなくても構いません。

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

  public :accele

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

  public :brake
end

car = Car.new
car.accele
car.brake

これで「accele」メソッドと「brake」メソッドは public なメソッドとなりました。

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

class Car
  def accele
    puts("アクセルを踏みました")
    speedChange
  end

  public :accele

  def brake
    puts("ブレーキを踏みました")
    speedChange
  end

  public :brake

  def speedChange
    puts("スピードが変わりました")
  end
  
  private :speedChange
end

car = Car.new
car.accele
car.brake

新しいメソッド「speedChange」を記述し、 private として設定しました。このメソッドはクラス内の他のメソッドからのみ呼び出すことができます。

private に設定されたメソッドに対して、クラスのインスタンスから呼び出そうとするとエラーとなります。例えば次のような記述は行えません。

car = Car.new
car.accele
car.speedChange

initializeメソッドの扱い

通常のメソッドは特に指定しない場合は public となりますが initialize メソッドだけは常に privateメソッドとして定義されます。よって initialize メソッドをクラスのインスタンスから呼び出すことはできません。

initialize メソッドについては「initializeメソッドの使い方」を参照されてください。

サンプルコード

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

# encoding: UTF-8

class Car
  def accele
    puts("アクセルを踏みました")
    speedChange
  end

  public :accele

  def brake
    puts("ブレーキを踏みました")
    speedChange
  end

  public :brake

  def speedChange
    puts("スピードが変わりました")
  end
  
  private :speedChange
end

car = Car.new
car.accele
car.brake

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

アクセス制限

-- --

Ruby でクラスで定義したメソッドのアクセス制限を行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。