Вызов метода унаследованного класса из метода экземпляра в 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 для лучшего понимания
Я считаю, что это связано с разницей в .protegido
Метод как часть мета-класса (или синглтон-класса), а не как часть самого класса B.
Прочитайте об этом здесь: Метапрограммирование в Ruby: это все о себе