Java と Ruby のアクセス制御の比較: Java でメソッドが private と宣言されている場合、同じクラス内の他のメソッドからのみアクセスできます。メソッドが保護されていると宣言されている場合、同じパッケージ内に存在する他のクラスだけでなく、別のパッケージ内のクラスのサブクラスからもアクセスできます。メソッドが public の場合、誰でも見ることができます。Java では、アクセス制御の可視性の概念は、これらのクラスが継承/パッケージ階層のどこにあるかによって異なります。
一方、Ruby では、継承階層またはパッケージ/モジュールが適合しません。どのオブジェクトがメソッドのレシーバーであるかがすべてです。
Ruby のプライベート メソッドの場合、明示的なレシーバーで呼び出すことはできません。暗黙的なレシーバーを使用してプライベートメソッドを呼び出すことができます (のみ)。
これは、宣言されているクラス内およびこのクラスのすべてのサブクラス内からプライベート メソッドを呼び出すことができることも意味します。
class Test1
def main_method
method_private
end
private
def method_private
puts "Inside methodPrivate for #{self.class}"
end
end
class Test2 < Test1
def main_method
method_private
end
end
Test1.new.main_method
Test2.new.main_method
Inside methodPrivate for Test1
Inside methodPrivate for Test2
class Test3 < Test1
def main_method
self.method_private #We were trying to call a private method with an explicit receiver and if called in the same class with self would fail.
end
end
Test1.new.main_method
This will throw NoMethodError
プライベート メソッドは、それが定義されたクラス階層の外から呼び出すことはできません。
保護されたメソッドは、private のように、暗黙的なレシーバーで呼び出すことができます。さらに、レシーバーが「自己」または「同じクラスのオブジェクト」である場合、明示的なレシーバー (のみ) によって保護されたメソッドを呼び出すこともできます。
class Test1
def main_method
method_protected
end
protected
def method_protected
puts "InSide method_protected for #{self.class}"
end
end
class Test2 < Test1
def main_method
method_protected # called by implicit receiver
end
end
class Test3 < Test1
def main_method
self.method_protected # called by explicit receiver "an object of the same class"
end
end
InSide method_protected for Test1
InSide method_protected for Test2
InSide method_protected for Test3
class Test4 < Test1
def main_method
Test2.new.method_protected # "Test2.new is the same type of object as self"
end
end
Test4.new.main_method
class Test5
def main_method
Test2.new.method_protected
end
end
Test5.new.main_method
This would fail as object Test5 is not subclass of Test1
Consider Public methods with maximum visibility
概要
パブリック: パブリック メソッドには最大の可視性があります
Protected: Protected メソッドは、private のように、暗黙の受信側で呼び出すことができます。さらに、レシーバーが「自己」または「同じクラスのオブジェクト」である場合、明示的なレシーバー (のみ) によって保護されたメソッドを呼び出すこともできます。
プライベート: Ruby のプライベート メソッドの場合、明示的なレシーバーで呼び出すことはできません。暗黙的なレシーバーを使用してプライベートメソッドを呼び出すことができます (のみ)。これは、宣言されているクラス内およびこのクラスのすべてのサブクラス内からプライベート メソッドを呼び出すことができることも意味します。