Мои мысли
1- Если вы разрабатываете проект впервые, попробуйте следовать принципу внедрения зависимостей, поскольку я ясно вижу, что вы создаете объекты Helper1, Helper2 в разных подклассах и, возможно, также дублируете код.
2- Я бы предложил создать Helper1 и Helper 2 в качестве свойств в вашем базовом классе, если вам не нужны разные экземпляры helper1 и helper 2 или, возможно, сделать их виртуальными, чтобы вы могли перезаписать их при необходимости.
3 - вы пишете непосредственно в реализацию, и ваш клиентский код напрямую зависит от конкретных классов, использующих интерфейсы, это сделает ваши классы более тестируемыми.
4- И ЗДЕСЬ ЗОЛОТОЕ ПРАВИЛО: Если проблема, с которой вы сталкиваетесь, не настолько сложна, и вы не видите причины для их изменения в ближайшем будущем, чем продолжаете использовать то, что делаете, НЕ ДЕЛАЙТЕ СВОЕ ЖИЗНЬ СЛОЖНАЯ.
ВСЕ хорошее хорошее программирование хорошо, но если вы видите лучшее и более простое решение, чем использование более простого becoz для использования ABSTRACTION, вы платите за сложность.
еще одно важное правило: Посмотрите, протестируете ли вы свой дизайн класса без внесения изменений в свой дизайн, чем ваш дизайн находится на правильном пути.