2011-03-06 3 views
2

나는 Beginning Ruby을 통해 읽고 있는데 개인적으로나 보호 된 방법에 관해서는 고민하고 있습니다. 이것은 초보자 질문입니다. 그래서 조금씩 검색했지만 개인적 방법과 보호 된 방법의 차이에 대해 명확하고 초보자 친화적 인 설명을 찾을 수 없었습니다.보호 된 방법과 개인 방법

이 책은 두 가지 예는 최초의 민간 방법에 대한 하나 제공 : 나는

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

그것은 내가 set_last_name을 사용할 수 없다는 것을 말해됩니다하려고하면,이 경우

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 

을 왜냐하면 그것은 사적이기 때문입니다. 거기까지 좋은. 보호로

그러나, 다른 예를 들어, 그들은 나이 방법을 정의하고 내가

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 –

답변

3

보호 된 메소드 (또는 속성)는 보호 된 메소드 (또는 속성)로 클래스를 상속하는 클래스에서만 사용할 수 있습니다. 클래스 A가 보호 방법이 있으면

a  d 
\  \ 
    b  e 
    \ 
    c 

, 이는 B 및 C에 의해 사용될 수 있지만, D 또는 E에 의해 사용될 수 없다. 참고 : 루비 클래스에서 상속하는 Ascii 아트 다이어그램. 이 경우에있어서의 F의 보호 방법을 "볼"수있어서

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 

때문에 동일한 클래스 (또는 상속 한), 그러나 개인 방법 캡슐 (원피) 모두의 'B'에있어서의 이 클래스가 그의 클래스 내부에서 호출되는 경우를 제외하고는 (다른 접근 가능한 메소드 (이 경우 call_b 메소드)에 의해).

+0

그럼 어떻게 'b'메서드를 호출할까요? 나는 아직도 혼란 스럽지만 그것을 이해하는 데 더 가까워지고 있다고 생각합니다. 공개 데프 B 클래스() 안의 단부의 call_b 을 call_b 및 개인 방법에 대한 액세스를 가지고 제가 – cabaret

+0

accesible 다른 방법을 만들 것이다. – Gareve

+0

고마워. 나는 지금 개념을 이해한다. 그러나 나는 아직도 당신이 다른 단계를 밟아야한다는 것을 의미한다면 사적인 것을 사용하는 이유에 대해 다소 혼란 스럽다. 차이는 여전히 나에게 너무 분명하지 않다. 불편을 드려 죄송합니다.) – cabaret