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はアクセス可能、コード略)
注意:rubyのアクセス制御はjavaとは異なり、パッケージの違いはありません.他のパッケージのクラスは、ターゲットクラスを参照するだけで、ターゲットクラスと同じパッケージの下のクラスアクセス制御ルールと同じです.
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とは異なり、パッケージの違いはありません.他のパッケージのクラスは、ターゲットクラスを参照するだけで、ターゲットクラスと同じパッケージの下のクラスアクセス制御ルールと同じです.