В дополнение к другим ответам добавляю еще:
Вы программируете интерфейс, потому что с ним проще работать. Интерфейс инкапсулирует поведение базового класса. Таким образом, класс является черным ящиком. Вся ваша настоящая жизнь - это программирование интерфейса. Когда вы используете телевизор, автомобиль, стереосистему, вы действуете на его интерфейсе, а не на деталях его реализации, и вы предполагаете, что в случае изменения реализации (например, дизельного двигателя или газа) интерфейс остается прежним. Программирование на интерфейсе позволяет сохранить ваше поведение, когда детали, не нарушающие работу, изменяются, оптимизируются или исправляются. Это также упрощает задачу документирования, изучения и использования.
Кроме того, программирование интерфейса позволяет вам определить поведение вашего кода еще до его написания. Вы ожидаете, что класс что-то сделает. Вы можете проверить это еще до того, как напишите реальный код, который это делает. Когда ваш интерфейс чистый и готовый, и вам нравится взаимодействовать с ним, вы можете написать реальный код, который что-то делает.