Как уже говорилось в комментариях, сложно сказать, как улучшить свой дизайн без всей картины.Возможно, вам придется создать отдельный класс для каждого конкретного типа T, например IntegerProblem, FractionProblem и т. Д., Но я не уверен.
Часть вашего вопроса связана с большими операторами switch.В вашем обновлении у вас есть, возможно, ненужный оператор switch, поэтому я думаю, что если я объясню вам, как избавиться от таких переключателей, вы можете избежать многих из них в других местах.
Это считается плохой привычкой, если вывключить тип или состояние объекта.Обычно это означает, что какой-то другой объект слишком много знает (тесно связан) с этим объектом.Вместо того, чтобы спрашивать объект о его состоянии и действовать в соответствии с ответом, вы должны попросить сам объект действовать в зависимости от его собственного состояния.
Это происходит в вашем методе CheckTheAnswer.Экземпляр Comparison2 запрашивает экземпляр Comparators, каково его состояние, а затем выполняет некоторую работу в зависимости от него.Вместо этого вы должны попросить экземпляр Comparators проверить Number1 и Number2.Итак, вам нужно добавить абстрактный метод в класс Comparators (вы можете назвать его, например, «check»), который возвращает bool и принимает два десятичных аргумента.Затем создайте подклассы Comparators для каждого из состояний (например, MinorComparators, MajorComparators и NoneComparators) и переопределите в них абстрактный метод («check»), чтобы каждый подкласс возвращал тот же результат, что и ваш переключатель.
Таким образомвам не нужно писать большие ключи и вы можете добавлять новые типы компараторов, не меняя ни один из ваших подклассов задачи.