2011-03-06 109 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

相關問題