Недавно у меня был случай, когда ключевое слово 'new' было весьма полезным. Я писал модульные тесты для методов в унаследованной кодовой базе, и у некоторых методов в классах, для которых я писал тесты, были скрытые внешние зависимости внутри методов. В то время включение фреймворка для решения проблемы казалось ненужным, поэтому вместо использования фреймворка я унаследовал класс, который хотел протестировать, внутри класса юнит-тестирования. Однако родительский метод не был виртуальным, поэтому его нельзя переопределить. Моим первым решением было просто добавить виртуальное ключевое слово в исходный метод, чтобы его можно было переопределить, и тесты работали отлично. Несмотря на то, что это сработало, я не думаю, что добавление виртуальных ключевых слов в сигнатуры методов только из-за необходимости «имитировать» их в модульном тесте является хорошим решением при проектировании (но я могу ошибаться). Вместо этого использование ключевого слова «new» в дочернем классе позволило мне «избавиться» от зависимостей родительских методов, скрыв оригинальный метод с методом со статическими возвращаемыми значениями, таким образом, написание быстрых модульных тестов для остальных методов также сработало как при замене не виртуальных методов на виртуальные методы.
В общем, я не уверен, что эту технику можно считать хорошей практикой. Однако использование такого рода техники может быть очень полезным при написании набора тестов, чтобы упростить рефакторинг при работе с устаревшим кодом со многими зависимостями, и не имеет автоматизированного набора тестов, с которого можно начать. Скорее всего, тесты можно будет улучшить после завершения работ по рефакторингу.
РЕДАКТИРОВАТЬ: Поскольку скрытие метода происходит только в частном унаследованном классе, это не должно вызывать путаницу, которая может возникнуть в других случаях использования.