Я не вижу никаких преимуществ в создании интерфейса для каждого класса.Это просто заставляет вас писать кучу кода дважды.
Я не вижу необходимости создавать интерфейс, чтобы отличать API от реализации.Список открытых функций класса с их подписями - это API.Если классу требуются рабочие функции, которые не являются частью API, они не должны быть открытыми.Я не вижу, чтобы
я создавал интерфейс, когда в данном контексте он служит полезной цели.В основном это означает:
(a) На практике моя самая распространенная причина - реализовать / смоделировать множественное наследование.Если мне нужно A расширяет B, но мне также нужна функция, которая принимает C, и я хочу передать A этой функции, тогда я должен сделать B или C интерфейсом, а не родительским классом, и сделать так, чтобы A расширял B, реализуетC или наоборот.
(b) Когда я создаю API для функции библиотеки или утилиты, которая будет реализована чем-то за пределами этой библиотеки или утилиты, обычно несколькими способами.«Сопоставимый» интерфейс в библиотеке Java может быть примером этого.Утилита сортировки нуждается в функции для сравнения пары объектов.Когда программа вызывает утилиту сортировки с объектами, определенными в вызывающей программе, нельзя ожидать, что утилита сортировки будет знать, как их сравнивать, поэтому вызывающая программа должна предоставить функцию сравнения.Сигнатура для функции сравнения логически отправляется через интерфейс, который вызывающая сторона может реализовать для своих объектов.
(c) Если я хочу опубликовать интерфейс, не раскрывая реализацию.Это может быть связано с собственными причинами, но на практике это обычно потому, что другой человек или команда будут реализовывать интерфейс.