Почти всегда получается, что я использую интерфейс и классы его реализующие. Но вот когда вдруг появляется необходимость в абстрактном классе, сразу затуп к чему применять интерфейс: к реализующему классу:
class FooService extends AbstractFooService implements FooServiceInterface {}
или в этом случае уже к абстрактному классу:
abstract class AbstractFooService implements FooServiceInterface {}
class FooService extends AbstractFooService {}
На основе чего делать выбор? Мне все еще нравится первый вариант. Но каких-то за или против у меня нет.
А вообще конечно стараюсь избегать абстрактных классов.