Я думаю, у вас неправильная концепция.Классы в Ruby похожи на классы в Java, Smalltalk, C #, ... и все являются шаблонами для своих экземпляров.Таким образом, класс определяет структуру и поведение его экземпляров, а также части структуры и поведения экземпляров его подклассов , но не наоборот .
Таким образом, прямой доступ из суперклассаконстанта в подклассе вообще невозможна, и это хорошо.Смотрите ниже, как это исправить.Для ваших классов определены следующие вещи:
class Animal
определяет метод make_noise
. - экземпляры
class Animal
могут вызывать метод make_noise
. class Dog
определяет константу NOISE
со своим значением. - экземпляры
Dog
, а сам класс Dog
может использовать константу NOISE
.
Что не возможно:
- Экземпляры
Animal
или самого класса Animal
имеют доступ к константам класса Dog
.
Youможет исправить это следующим изменением:
class Animal
def make_noise
print Dog::NOISE
end
end
Но это плохой стиль, потому что теперь ваш суперкласс (который является абстракцией о Dog
и других животных) теперь знает что-то, что принадлежит Dog
.
Лучшее решение было бы:
- Определить абстрактный метод в классе
Animal
, который определяет, что make_noise
должно быть определено.Смотрите ответ https://stackoverflow.com/a/6792499/41540. - Определяйте в ваших конкретных классах метод снова, но теперь со ссылкой на константу.