Посмотрите книгу Шаблоны проектирования Head-First ... вы увидите хорошие аргументы в пользу использования интерфейсов, которые не имеют ничего общего с TDD или полиморфизмом.
Интерфейсы позволяют вам изменять поведение объекта во время выполнения ... Подумайте о местах, где вам понадобится обработчик для определенного поведения, но вы можете не знать, какое поведение требуется до времени выполнения. В случае вычисления расходов для сотрудников ... Менеджеры могут иметь более высокие надбавки к расходам на «развлечения», чем обычный сотрудник.
Если ваш объект Employee имеет ссылку на интерфейс IExpenseCalculator, вы можете назначить ему калькулятор менеджера или калькулятор сотрудника во время выполнения. Вызов Employee.GetExpenses () даст вам другой рассчитанный результат для менеджера, чем для обычного сотрудника. Внутренне код будет выглядеть так:
public class Employee {
private IExpenseCalculator expenses;
public ExpenseSheet GetExpenses() {
return expenses.CalcExpenses();
}
}
В этом примере предполагается, что «расходы» представлены как свойство, и что в IExpenseCalculator есть метод для CalcExpenses ().
Интерфейсы также тесно связаны с концепцией объектных фабрик ... думаю, уровень базы данных. Когда вы настроили свой уровень данных как фабрику, вы можете создавать объекты для динамического подключения к Sql Server, Oracle или MySql во время выполнения на основе параметров конфигурации. Но клиенту нужен конкретный дескриптор объекта уровня базы данных ... введите Интерфейсы.
Интерфейсы - это мощный инструмент, которым часто злоупотребляют. Правильное их использование изменит ваш образ мышления, но может значительно помочь структуре вашего приложения.