Вообще говоря, подход, который я использую в подобной ситуации, состоит в том, чтобы иметь как интерфейс, так и абстрактный класс. Интерфейсы определяют, ну, интерфейс. Абстрактный класс - это просто помощник.
Вы действительно не можете ошибиться в этом подходе. Интерфейсы дают вам гибкость для изменения реализации. Абстрактные классы дают вам код шаблона и помощника, который вы не принудительно используете, что вы в противном случае были бы, если бы ваши методы были определены в терминах абстрактного класса явно.