Первый вид рекомендуется для открытого интерфейса класса (скажем, объявление атрибутов в классе). Это известный совет, который вы должны запрограммировать для интерфейса, а не для конкретной реализации (это указано в Design Patterns). Количество классов, которые вы должны импортировать, мало связано с качеством кода и хорошим дизайном.
Преимущество первой формы заключается в том, что она позволит вам легко заменять реализации позже, если возникнет такая необходимость, тогда как вторая реализация наследует класс реализации, делая ваш код сложнее развиваться и менее гибким.
Бывают случаи, когда можно объявить и использовать конкретные классы, хотя (например, для небольшого снижения производительности). Но публичный интерфейс класса должен по возможности использовать интерфейсы, это облегчит реализацию будущих изменений.
Прежний позволяет вам использовать _abstraction_. – rocketboy
Помимо очевидного ответа, вы не должны беспокоиться об импорте. Они не влияют на производительность во время выполнения. –
Взгляните на [what-does-it-mean-to-program-to-an-interface] (http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to -an-interface) – Pshemo