2015-08-03 8 views
1

У меня есть следующий код на Ruby:Calling метод наследуется класс от метода экземпляра в Руби

class B 
    class << self 
    protected 
    def prot 
     puts "victory" 
    end 
    end 
end 
class C < B 
    def self.met 
    C.prot 
    end 
end 

C.met 

, которая пытается доказательства того, что защищаемых методы класса наследуется в Ruby. Проблема заключается в том, что если я конвертирую метод met в метод экземпляра следующим образом:

class B 
    class << self 
    protected 
    def prot 
     puts "victory" 
    end 
    end 
end 
class C < B 
    def met 
    C.prot 
    end 
end 

c = C.new 
c.met 

он не будет работать. Может быть, это связано с областью методов класса и экземпляра?

+0

Я получаю ошибку: 'защищенного метода«»protegido призвал C: Class' - который показывает наследование делает работу ... это просто, что защита работает. – Myst

+0

@Rodrigo Вы поняли его – pramod

ответ

1

Это не сработает, потому что экземпляр C не является kind_of?(B.singleton_class).

В рубине защищенный метод может быть вызван в контексте объекта, который является kind_of? классом, который определяет метод, с явным приемником, который также является kind_of? классом, который определяет метод.

Вы определили защищенный метод для одноэлементного класса B, чтобы этот метод можно было вызывать только в объектах, которые являются kind_of?(B.singleton_class). Класс C наследует B, поэтому класс singleton C наследует одноэлементный класс B, поэтому C - kind_of? B.singleton_class. Таким образом, в вашем первом случае это работает. Но, очевидно, C.new не kind_of? B.singleton_class, так что это не сработает.

0

В случае защищенных методов мы можем вызывать их из области действия любого объекта, принадлежащего к одному классу. В вашем фрагменте кода, в соответствии с областью действия класса, цепочка поиска метода выбирает этот метод, поскольку он унаследован суперклассом. Это означает, что вы определяете метод в своем классе Singleton, поэтому мы можем вызвать его, используя объекты этого класса. поэтому мы можем назвать его объектом A и B из-за объекта B, унаследованного от A.

Одним словом вы можете вызвать защищенный метод в общедоступном методе класса. Пожалуйста, обратитесь ниже URLs для лучшего понимания

http://nithinbekal.com/posts/ruby-protected-methods/

accessing protected methods in Ruby

0

Я считаю, что он должен делать с разницей объявления метода .protegido в рамках мета-класса (или одноплодной класса), а чем как часть самого класса B.

Читайте об этом здесь: Metaprogramming in Ruby: It's All About the Self