Прежде всего, если вы беспокоитесь о переучивании класса, то вы, вероятно, неправильно делаете наследование. Наследование должно использоваться для установления отношений «есть», а не просто для повторного использования кода. Если вам нужно повторное использование кода в одиночку, рассмотрите возможность использования делегирования, а не наследования. Я полагаю, вы могли бы ввести промежуточный тип между подтипом и его родителем, но я бы позволил этой возможности управлять моим дизайном.
Во-вторых, если вам нужно использовать функциональность из базового класса, но расширять его И использовать сценарии использования для статического метода, то вы можете рассмотреть возможность использования некоторого внешнего класса для хранения функциональности. Классический случай для этого, на мой взгляд, это шаблон Factory. Одним из способов реализации шаблона Factory является использование фабричных методов, статического метода класса, который создает экземпляр этого класса. Обычно конструктор защищен, поэтому метод фабрики является единственным способом создания класса извне.
Один из способов приблизиться к повторному использованию с фабричными методами в иерархии наследования - поместить общий код в защищенный метод и вызвать этот метод из фабричного метода, а не напрямую вызывать фабричный метод базового класса из подтипов. Заводской метод. Лучшая реализация может использовать ту же технику, но переместить Методы Фабрики в класс Фабрики и использовать логику конструктора (внутреннюю теперь, а не частную), возможно, в сочетании с методом (ами) инициализации, чтобы создать объект. Если наследуемое вами поведение является внешним по отношению к классу (дешифрование / проверка / и т. Д.), Вы можете использовать общие методы (или композицию) в пределах Factory, чтобы разрешить повторное использование между методами Factory.
Не зная цели использования статических методов, сложно дать вам точное направление, но, надеюсь, это поможет.