我目前正在尝试了解封装机制如何在Ruby中运行:
class A
def public_method_A; p private_method; end;
private
def private_method; 'A'; end;
end
class B < A
def public_method_B; p private_method; end;
private
def private_method; 'B'; end;
end
现在,当我尝试运行此代码时,我得到的是:
1. > A.new.public_method_A => "A"
2. > B.new.public_method_B => "B"
3. > B.new.public_method_A => "B"
基本上,第三个调用是指在B中定义的私有方法,而不是在A中。从Java开发人员的角度来看,它是一个封装违规。对private_method
的调用应始终引用调用类中定义的方法。但是在Ruby中,它似乎更像是一个上下文问题。这是对的吗?
如何确保我的私有方法永远不会在各自的类之外调用?我做错了吗?
提前感谢您的帮助。
答案 0 :(得分:0)
Nutshell:private
表示消息不能有明确的接收者。
这就是全部;仅此而已。
它从公共API中删除了消息,但对子类等没有任何作用。
protected
表示只有实例和子类实例可以调用该方法,例如,你不能从继承树之外调用它。
请注意,两者都可以通过send
轻易破坏。