2011-03-06 146 views
2

我正在阅读Beginning Ruby,我被困在有关私有和受保护方法的部分。我知道这是一个新手问题。我通过SO搜索了一下,但我无法找到一个清晰的,新手友好的解释私人和受保护方法之间的区别。受保护的和私有的方法

书中给出两个例子,用于私人的第一个方法:

class Person 
    def initialize(name) 
    set_name(name) 
    end 

    def name 
    @first_name + ' ' + @last_name 
    end 

    private 
    def set_name(name) 
    first_name, last_name = name.split(/\s+/) 
    set_first_name(first_name) 
    set_last_name(last_name) 
    end 

    def set_first_name(name) 
    @first_name = name 
    end 
    def set_last_name(name) 
    @last_name = name 
    end 
end 

在这种情况下,如果我尝试

p = Person.new("Fred Bloggs") 
p.set_last_name("Smith") 

它会告诉我,我不能使用set_last_name方法,因为它是私人的。一切都好,直到那里。

然而,在其他的例子,他们定义了一个时代的方法保护,当我做

fred = Person.new(34) 
chris = Person.new(25) 
puts chris.age_difference_with(fred) 
puts chris.age 

它给出了一个错误:

:20: protected method 'age' called for #<Person:0x1e5f28 @age=25> (NoMethodError) 

我真的看不到的区别私人和受保护的方法,这听起来与我一样。有人能给我提供一个清晰的解释,所以我再也不会对此产生困惑吗?

如果需要,我会提供第二个示例的代码。

+0

Checkout http://stackoverflow.com/questions/3534449/why-does-ruby-have-both-private-and-protected-methods – 2011-03-06 21:26:18

回答

3

受保护的方法(或属性)只能由继承具有受保护方法(或属性)的类的类使用。

a  d 
\  \ 
    b  e 
    \ 
    c 

如果类a有一个受保护的方法,这可以由b和c使用,但不能由d或e使用。 注意:Ascii艺术图表继承红宝石类。

class A 
    public 
    def f obj 
     obj.c 
    end 
    def g obj 
     obj.b 
    end 
    def call_b 
    b 
    end 

    private 

    def b 
     puts "Hi!_b" 
    end 


    protected 
    def c 
     puts "Hi!_c" 
    end 
end 

a = A.new 
b = A.new 

a.f(b) # Hi!_c 
a.g(b) # inj.rb:7:in `g': private method `b' called for #<A:0xb76df4cc> (NoMethodError) 
a.call_b # Hi!_b 

在这种情况下,该方法F能够“看到”受保护的方法,因为同一类(或继承的一个),但私有方法包封(隐藏)的所有的“B”的方法的其除了如果这是在他的类的内部调用(通过另一个可访问的方法(在这种情况下是方法call_b))。

+0

那么你怎么去调用'b'方法呢?我想,我仍然感到困惑,但接近理解它。 – cabaret 2011-03-06 22:40:15

+0

我会创造另一个入店方法: 公共 高清call_b B() 结束 call_b它的类里面,并有机会获得私有方法。 – Gareve 2011-03-06 22:43:45

+0

非常感谢。我现在理解这个概念,但我仍然有点困惑,为什么你会使用私人的,如果这意味着不得不采取另一个步骤..差异仍然不是太清楚。对不起,这样的麻烦;) – cabaret 2011-03-06 23:06:03