2015-05-18 2 views
9
class Main 
    def say_hello 
     puts "Hello" 
    end 

    private 
     def say_hi 
      puts "hi" 
     end 
end 

class SubMain < Main 
    def say_hello 
     puts "Testing #{say_hi}" 
    end 

end 

test = SubMain.new 
test.say_hello()  

ВЫВОД:Почему ruby ​​позволяет дочерним классам обращаться к закрытым методам родителей?

привет

Тестирование

+0

Он наследует этот метод. Почему, по-вашему, нельзя называть это? – spickermann

+0

@CanadianCoder Я думал, что члены OOP класса, объявленные как private, не наследуются подклассами этого класса. По крайней мере, в Java и PHP, как я полагаю. – CodeCrack

+0

Только что начал изучать Ruby сам и должен сказать, читая «The Book of Ruby», эта идея кажется немного нечеткой, если не вводить в заблуждение, учитывая поведение, но, возможно, это только я. И да Java не позволяет дочерним классам обращаться к приватным методам супер. – ChiefTwoPencils

ответ

9

Разница заключается в том, что в рубине можно назвать частные методы в подклассах неявно, но не явно. Защищенный можно назвать двумя способами. А почему? Думаю, тебе придется спросить Маца.

Пример:

class TestMain 

    protected 
    def say_bueno 
    puts "bueno" 
    end 

    def say_ni_hao 
    puts "ni hao" 
    end 

    private 
    def say_hi 
    puts "hi" 
    end 

    def say_bonjour 
    puts "bonjour" 
    end 
end 

class SubMain < TestMain 
    def say_hellos 
    # works - protected/implicit 
    say_bonjour 
    # works - protected/explicit 
    self.say_ni_hao 

    # works - private/implicit 
    say_hi 
    # fails - private/explicit 
    self.say_bonjour 
    end 
end 

test = SubMain.new 
test.say_hellos() 
Смежные вопросы