Во-первых, в качестве общего напоминания, просто не забудьте использовать наследование для подстановки, а не повторное использование кода. Примерно это означает, что все, что наследуется от вашего базового модуля, должно поддерживать (в основном) одни и те же операции, и что если пользователь скажет open
, close
или update
в любом модуле, это обеспечит ожидаемые результаты.
Вы действительно хотите менеджер модулей? Вместо этого может быть лучше нарисовать диаграмму отношений между вашими различными классами / модулями и создать там связь, а не менеджер высшего уровня. Тогда основной цикл приложения будет знать об одном или нескольких модулях высокого уровня и напрямую вызывать соответствующие методы для них. При желании может быть даже модуль высокого уровня для управления этим высоким уровнем делегирования.
Для вашего примера консоли, если вы не хотите поддерживать несколько консолей, вам, вероятно, лучше просто сохранить пространство имен: это дает вам возможность напрямую ссылаться на единственную консоль, с которой вы взаимодействуете. В качестве альтернативы вы могли бы потребовать, чтобы «родительская консоль» передавалась каждому созданному модулю, и он использует эту связанную консоль для соответствующего ввода-вывода. Это дает вам гораздо больше гибкости за счет того, что вам необходимо поддерживать консоль в базовом модуле.