2015-07-04 14 views
6

mam kod w następujący sposób:Czy prywatna metoda Ruby jest dostępna w podklasie?

class A 
    private 
    def p_method 
    puts "I'm a private method from A" 
    end 
end 

class B < A 
    def some_method 
    p_method 
    end 
end 

b = B.new 
b.p_method # => Error: Private method can not be called 
b.some_method # => I'm a private method from A 

b.some_method nazywa prywatną metodę, która jest zdefiniowana w klasie A. W jaki sposób można uzyskać dostęp do metody prywatnej w klasie, w której jest dziedziczona? Czy to zachowanie jest takie samo we wszystkich językach programowania obiektowego? Jak działa enkapsulacja Ruby?

+0

[Czy istnieją dobre powody „prywatny”, aby działać w sposób ma to miejsce w Ruby?] (Https: // stackoverflow.com/questions/1565269/are-there-good-reasons-for-private-to-work-the-way-it-does-in-ruby) – cremno

+0

W rzeczywistości uzyskujesz dostęp do prywatnej metody 'p_method' swojej bazy klasa z wewnątrz zakresu instancji klasy sub, po prostu w porządku. To oczywiste, dlaczego nie możesz uzyskać do niego dostępu z zewnątrz. Zakres prywatny jest zachowany, nie zmieni się, gdy jesteś podklasą. – limekin

+0

W jaki sposób dziedziczenie lub enkapsulacja są istotne w przypadku prywatnych metod? – sawa

Odpowiedz

6

Oto krótkie wyjaśnienie od this source:

  1. metody publiczne mogą być wywoływane przez nikogo --- nie ma kontroli dostępu. Metody są domyślnie publiczne (z wyjątkiem inicjowania, które jest zawsze prywatne).
  2. Metody chronione mogą być wywoływane tylko przez obiekty klasy definiującej i jej podklasy. Dostęp jest przechowywany w rodzinie.
  3. Prywatnych metod nie można wywołać z jawnym odbiornikiem. Ponieważ nie można określić obiektu podczas jego używania, prywatne metody mogą być wywoływane tylko w klasie definiującej i przez bezpośrednich potomków w obrębie tego samego obiektu.

Ta odpowiedź z podobnym pytaniem rozszerza się na ten temat bardziej szczegółowo: https://stackoverflow.com/a/1565640/814591

+0

Dzięki. Są wystarczająco wyjaśnione. –