РЕДАКТИРОВАТЬ : этот ответ правильный, хотя Уэйн является более рубиновым способом решения проблемы.
Да, это так.
Ваша реализация будет не работает, потому что родитель пытается разрешить EWOK локально.Родитель не имеет EWOK.Тем не менее, вы можете сказать Ruby, чтобы он специально смотрел на класс фактического экземпляра, к которому был вызван метод, чтобы получить EWOK.
this будет работать:
class Parent
def go
self.class::EWOK
end
end
class Child < Parent
EWOK = "Ewoks Rule"
end
class Child2 < Parent
EWOK = "Ewoks are ok, I guess"
end
bob = Child.new
bob.go # => "Ewoks Rule"
joe = Child2.new
joe.go # => "Ewoks are ok, I guess"
что здесь происходит: в родителе «go» «я» будет ссылаться на экземпляр объекта, который на самом деле вызывается «go».то есть Боб (Ребенок) или Джо (Ребенок2).self.class получает фактический класс этого экземпляра - Child в случае bob или Child2 в случае joe.затем self.class :: EWOK извлечет EWOK из правильного класса.