Насколько я понимаю, интерфейс был классом, который никогда не был
реализовано, но было унаследовано от соблюдения стандартов. Так почему же
интерфейсы, используемые как настоящие классы.
Это немного запутано. Интерфейс определяет API, так что куски кода от разных авторов, модулей или проектов могут взаимодействовать. Например, java.util.Collections.sort()
может сортировать все, что реализует интерфейс List
и содержит объекты, которые реализуют интерфейс Comparable
- даже если классы реализации еще не существовали, когда был написан код сортировки!
Теперь ситуация в вашем проекте отражает, к сожалению, довольно распространенный антипаттерн: интерфейс для всего , в основном с одним классом реализации, даже для внутренних классов.
Раньше это активно продвигали сторонники Test-Driven-Development (TDD), которые считают жизненно важным иметь возможность тестировать каждый класс изолированно со всеми его зависимостями, заменяемыми фиктивными объектами. Более старые моделирующие среды могли только моделировать интерфейсы, поэтому, чтобы иметь возможность тестировать каждый класс изолированно, все межклассовые зависимости должны быть через интерфейсы.
К счастью, новые фреймворки для насмешек могут насмехаться над конкретными классами и не требуют от вас загрязнения вашего проекта ненужными интерфейсами. Некоторые люди, вероятно, все еще будут утверждать, что в любом случае это нужно сделать, чтобы «уменьшить сцепление», но ИМО просто рационализируют свое желание не менять свою практику.
И, конечно, если вы не пользуетесь фундаменталистским TDD, никогда не было веской причины иметь интерфейс для всего - но очень веские причины иметь интерфейсы для некоторых вещей.