2016-03-03 4 views
0

я видел что-то вроде этого this library:Вложенные классы, которые наследуют от своих родителей

class A 
    # ... 
    class B < A 
    # ... 
    end 
end 

Разве это не странно? Я понимаю, что вы можете объявлять классы внутри других классов, но эти вложенные классы наследуют от родительского. Разве это не похоже на бесконечный цикл?

Возможно, это проще, чем кажется, но этот образ заставляет меня смущаться. Я пропустил какую-то укрывающую выгоду здесь или особую рубиновскую идиому, которую я не знаю?

ответ

2

Пространство имен и подклассы - это две разные вещи. Они не имеют никакого отношения друг к другу.

Поступая:

class A 
    class B 
    end 
end 

вы определяете B в пространстве имен A, следовательно A::B (но B не подкласс A, на самом деле это подкласс Object).

Поступая:

class A 
end 

class B < A 
end 

вы определяете B как подкласс A (но B не в пространстве имен A, на самом деле она находится в пространстве имен главной среды :: (или Object::).

В вашем примере:

class A 
    class B < A 
    end 
end 

как Хаппа но они независимы друг от друга, и нет противоречия.

2

В дополнение к ответу @ sawa: это может быть полезно в качестве промежуточного этапа во время рефакторинга.

Скажите, я натолкнулся на какой-то большой жирный класс, и я ясно вижу, что здесь можно извлечь несколько подклассов. Но я еще не знаю их имен. И когда я это сделаю, я мог бы переименовать их несколько раз в процессе. Это делает создание файла для каждого подкласса ненужным препятствием. Поэтому я начинаю с объявления подклассов прямо там и перемещаю код в том же файле. Когда я немного доволен, , то Я переместлю подклассы в их выделенные файлы. Или, может быть, я не буду, если они очень маленькие (и я чувствую, что они не заслуживают отдельного файла).

Смежные вопросы