Вызов метода унаследованного класса из метода экземпляра в Ruby

У меня есть следующий код Ruby:

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

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

3 ответа

Решение

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

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

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

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

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

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

доступ к защищенным методам в Ruby

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

Прочитайте об этом здесь: Метапрограммирование в Ruby: это все о себе

Другие вопросы по тегам