Можно обойтись, но такой код быстро станет неподдерживаемым. Характерный пример использования интерфейсов — написание несколько разных хранения данных (например inmemory и в базе данных), а затем использование их через общий интерфейс в разных случаях (например на проде и в тестах)