Ruby не имеет вложенных классов.
Единственный способ унаследовать поведение - это, ну, через наследование.
Если вы хотите, чтобы ваш код работал, вам нужно использовать язык, который поддерживает вложенные классы. Хотя это невероятно аккуратный и мощное средство, я, к сожалению, знаю только два языка, которые гнездились классы:
Я не знаю ни одного другого.
У Java есть конструкция, называемая вложенными классами, но у них есть некоторые неудачные ограничения дизайна.
В вашем примере выше, это не класс B
, который вложен в A
, это константаB
, который вложен в A
. Подумайте об этом:
C = A::B
Теперь класс доступен под два названиями: A::B
и C
. Должно быть сразу очевидно, что C
является глобальным и не вложен внутри A
. (Ну, на самом деле, C
вложен внутри Object
, потому что на самом деле также нет глобальных констант, но это не так.) Но так как C
и A::B
- это тот же класс, он, очевидно, не может быть как вложенным, так и не вложенным. Единственный логический вывод состоит в том, что сам класс не вложен.
Определяющая особенность вложенных классов заключается в том, что поиск метода проходит по двум измерениям: вверх по цепочке наследования, а также через вложенность. Ruby, как и 99,9% всех языков OO, поддерживает только первый. (В некотором смысле вложенные классы наследуют не только функции своего суперкласса, но и особенности окружающего их класса.)
Сделать 'B' наследовать' A'? – adamax