Никакой магии здесь.
Когда вы объявляете B
, все происходит в следующем порядке (грубо говоря):
B
(экземпляр Class
) (который наследует все от A
).На данный момент у него нет ничего конкретного.
A.inherited
hook вызывается.
B
класс открывается и обрабатывается,Только в этот момент он получает свои собственные свойства и методы (кроме тех, которые могут быть созданы внутри хука).
Итак, когда (2) происходит единственное name
, котороедоступно для B
, определено в A
.
Это очень легко проверить с помощью следующего кода:
class A
def self.name
"a"
end
def self.inherited(subclass)
puts "B own methods, point 1: #{subclass.methods(false).join(', ')}"
end
end
class B < A
puts "B own methods, point 2: #{self.methods(false).join(', ')}"
def self.name
"b"
end
puts "B own methods, point 3: #{self.methods(false).join(', ')}"
end
# B own methods, point 1:
# B own methods, point 2:
# B own methods, point 3: name
Теперь все ясно, верно?