Думаю, сначала нужно четко определить, что не всегда и не во всех случаях необходимо реализовывать интерфейс. Так, для класса Point2D абсолютно этого не надо, или же Vector2D, Vector3D.
Выше приводили пример с фигурами — однако, он показывает не это. Его предназначение — наследование в ООП (вспомним три постулата: полиморфизм, инкапсуляция и наследование).
Интерфейсы, на практике, определяются в большинстве случаев для:
- уменьшения связности системы
- классов (объектов), выполняющих роль по обработке данных
- классов (объектов), следующих какому-либо паттерну программирования (репозиторий, стратегия)
- на этапе проектирования для создания заглушек
- для использования в юнит-тестировании
А так как Вы еще писали про C# — то вспомним и про явную и неявную реализацию интерфейса, что удобно, например в GUI.
Интерфейс — скелет, на котором строится вся система.