私有方法和封装:防止意外的私有方法覆盖

时间:2014-12-16 13:39:28

标签: ruby encapsulation

我目前正在尝试了解封装机制如何在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中,它似乎更像是一个上下文问题。这是对的吗?

如何确保我的私有方法永远不会在各自的类之外调用?我做错了吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Nutshell:private表示消息不能有明确的接收者。

这就是全部;仅此而已。

它从公共API中删除了消息,但对子类等没有任何作用。

protected表示只有实例和子类实例可以调用该方法,例如,你不能从继承树之外调用它。

请注意,两者都可以通过send轻易破坏。

Nice summary of private and protected in Ruby

相关问题