Конечно [есть несколько преимуществ]!
Основным, вероятно, является возможность реализации нескольких классов, которые поддерживают указанный интерфейс, и использование этих классов взаимозаменяемо [в отношении конкретного интерфейса] , Одним из непосредственных применений этого является использование классов Mock для тестирования; Это также используется с шаблоном IoC (Inversion of Control), и в более общем смысле, где бы мы ни заботились о «Что», а не о «Кто», т. Е. Важно то, что какой бы класс ни находился на месте, он ведет себя согласно контракту (API) ) независимо от того, «кто» (какой класс) это.
Другим существенным преимуществом интерфейсов является способность модулировать поведение . Например, ваше приложение может реализовать концепцию, которая работает, скажем, как List (может быть перебрана, снабжена множеством элементов и т. Д.) и как средство проверки виджета (некоторая особенность приложения). Имея два интерфейса, «описывающих» этот конкретный объект, вы можете использовать экземпляры этого класса везде, где бы вы ни использовали List (и только это), и аналогичным образом вы можете использовать его в качестве средства проверки виджета (и только это), где бы ни нужны эти средства проверки , Это похоже на множественное наследование, но более гибкое.
В двух словах (и некоторых других ответах, начавшихся с этого), Интерфейс определяет контракт и класс (ы) реализуют его (его) .
Технически, один класс мог бы выполнять обе эти вещи, т.е. вам не нужно ___ иметь интерфейсы, но очень предпочтительно определять API для почти любого поведения, которое может быть реализовано несколькими классами (будь то множественные реализации почти одного и того же) как с «фиктивными классами» или очень разными классами, но предоставляющими одну конкретную универсальную услугу / функцию, как, скажем, два очень разных Списка.)