Мне нравится называть эти типы функций "подразумеваемой документацией по коду". Использование интерфейса может передать много информации другим разработчикам, которые будут работать над вашим проектом, и эта информация поможет предотвратить множество головных болей.
Например, если класс реализует интерфейс, который имеет 2 метода, и я новичок в проекте, это может сказать мне, что разработчик, который написал эти методы, не хочет, чтобы сигнатура метода изменилась.
Подумайте о классе Dog и классе Cat, которые оба реализуют интерфейс Sociable, где есть методы walk (int speed), sit (), layDown (), bite (int Степень).
Если у нас есть класс Dog и класс Cat, которые реализуют эти методы, и у них есть зависимости, изменение сигнатуры метода одного из них может иметь некоторые отрицательные последствия.
Интерфейсы - это способ помочь описать класс. В этом примере у Общительной Собаки и Общительной Кошки много общего.
Что касается возможности повторного использования, ваши классы становятся повторно используемыми, потому что другим труднее прийти и изменить контракт, определенный в сигнатуре метода.
Наконец, хотя класс может создавать подкласс только одного класса, он может реализовывать несколько интерфейсов. Таким образом, преимущество использования интерфейса состоит в том, что у меня может быть Dog, который реализует Big and Sociable, и Cat, который реализует Small и Sociable.