Многие люди используют интерфейсы для определения абстрактных классов - все члены класса, без явной реализации. Честно говоря, я не вижу в этом особой ценности.
Я предпочитаю использовать интерфейсы, чтобы сделать одну из двух вещей:
- Показать ортогональные возможности класса
- Объявите требования к классу
Второй, на мой взгляд, более интересный и, вероятно, заслуживает большего объяснения. Вы можете написать класс, который требует способности загружать или сохранять некоторые данные. Вместо непосредственного общения с любым хранилищем данных, которое вы будете использовать, вы можете объявить интерфейс, содержащий методы, которые вы хотите вызывать.
Затем реализуйте класс, который имеет эти методы (реализует этот интерфейс), и передайте его классу, который этого хочет.
Это дает вам хорошую абстракцию и разделение обязанностей.