Rubyでのpublic、private、protectedの区別小結

1559 ワード

privateとprotectedに重点を置く
public
デフォルトはpublicで、グローバルにアクセスできます.これは説明しません.
private
C++,「private」は「private to this class」を意味するが,Rubyは「private to this instance」を意味する.C++では、クラスAに対して、クラスAにアクセスできる限り、Aのオブジェクトにアクセスできるprivateメソッド.Rubyでは、できません.このオブジェクトのインスタンスでのみ、このオブジェクトのprivateメソッドにアクセスできます.ルビーの原則は「privateはメソッド受信者を指定できないことを意味する」ため、受信者はselfのみであり、selfは省略しなければならない.したがってRuby中性子クラスは親クラスのprivateメソッドにアクセスできる.だがprivate_methodは間違っています.
protected
このクラスまたはサブクラスにアクセスできますが、他のクラスにはアクセスできません.
テストコード(publicはアクセス可能、コード略)

class A
 def test
  protected_mth
  private_mth
 
  self.protected_mth
  #self.private_mth   #wrong
 
  obj = B.new
  obj.protected_mth
  #obj.private_mth    #wrong
 end
 
 protected
 def protected_mth
  puts "#{self.class}-protected"
 end
 
 private
 def private_mth
  puts "#{self.class}-private"
 end
end
 
class B < A
 def test
  protected_mth
  private_mth
 
  self.protected_mth
  #self.private_mth   #wrong
 
  obj = B.new
  obj.protected_mth
  #obj.private_mth    #wrong
 end
end
 
class C
 def test
  a = A.new
  #a.protected_mth     #wrong
  #a.private_mth      #wrong
 end
end
 
A.new.test
B.new.test
C.new.test

注意:rubyのアクセス制御はjavaとは異なり、パッケージの違いはありません.他のパッケージのクラスは、ターゲットクラスを参照するだけで、ターゲットクラスと同じパッケージの下のクラスアクセス制御ルールと同じです.