Ключ в том, что «один разработчик может написать код, который использует интерфейс», то есть вы можете написать код, который работает с экземплярами классов, которые реализуют этот интерфейс, и вызывать методы для них, фактически не зная, каким классом будут эти экземпляры или какие-либо другие.детали реализации, которые могут нарушить ваш код.
Таким образом, написание кода означает, что вы можете скомпилировать его, но, конечно, приложение не будет работать, если не будет предоставлена реализация.Одной из реализаций может быть макет, который будет полезен для целей тестирования и который будет трудно сделать с абстрактными классами.
Почему абстрактные классы во многих случаях являются худшим выбором?Одной из причин может быть то, что класс может иметь только один прямой суперкласс и, следовательно, не может наследоваться от нескольких независимых абстрактных классов, в то время как реализация нескольких независимых интерфейсов проста.Это, помимо прочего, позволяет уменьшить связь, потому что вам не нужно помещать несвязанные методы в один класс.